github地址:
git@github.com:ZQCard/design_pattern.git
抽象工厂模式:
先来认识下什么是产品族: 位于不同产品等级结构中,功能相关联的产品组成的家族。
图中的BmwCar和BenzCar就是两个产品树(产品等级结构);而如图所示的BenzSportsCar和BmwSportsCar就是一个产品族。他们都可以放到跑车家族中,因此功能有所关联。同理BmwBussinessCar和BenzBusinessCar也是一个产品族。
可以这么说,它和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且抽象工厂模式是三个里面最为抽象、最具一般性的。抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象。
而且使用抽象工厂模式还要满足一下条件:
1.系统中有多个产品族,而系统一次只可能消费其中一族产品
2.同属于同一个产品族的产品以其使用。
来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):
抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。它由抽象类或者接口来实现。
具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
抽象产品角色:它是具体产品继承的父类或者是实现的接口。一般有抽象类或者接口来实现。
具体产品角色:具体工厂角色所创建的对象就是此角色的实例。由具体的类来实现。
(1)Driver.class.php(抽象父类,用于规范子类实现)
<?php namespace Factory\AbstractFactory; abstract class Driver
{
public abstract function driverBenzCar();
public abstract function driverBwmCar();
}
(2)BenzCar.class.php(抽象父类,用于规范子类实现)
<?php namespace Factory\AbstractFactory; abstract class BenzCar
{
public abstract function drive();
}
(3)BenzSportCar.class.php(具体实现类)
<?php
namespace Factory\AbstractFactory; class BenzSportCar extends BenzCar
{
public function drive()
{
return '开奔驰跑车';
}
}
(4)BenzBusinessCar(具体实现类)
<?php
namespace Factory\AbstractFactory; class BenzBusinessCar extends BenzCar
{
public function drive()
{
return '开奔驰商务车';
}
}
(5)BwmCar.class.php(抽象父类,用于规范子类实现)
<?php namespace Factory\AbstractFactory; abstract class BwmCar
{
public abstract function drive();
}
(6)BwmSport.class.php(具体实现类)
<?php
namespace Factory\AbstractFactory; class BwmSportCar extends BenzCar
{
public function drive()
{
return '开宝马跑车';
}
}
(7)BwmBusiness.class.php
<?php
namespace Factory\AbstractFactory; class BwmBusinessCar extends BenzCar
{
public function drive()
{
return '开宝马商务车';
}
}
(8)BusinessDriver.class.php(具体产品族实现类)
<?php namespace Factory\AbstractFactory; class BusinessDriver extends Driver
{
public function driverBenzCar()
{
return new BenzBusinessCar();
} public function driverBwmCar()
{
return new BwmBusinessCar();
}
}
(9)SportDriver.class.php(具体产品族实现类)
<?php namespace Factory\AbstractFactory; class SportDriver extends Driver
{
public function driverBenzCar()
{
return new BenzSportCar();
} public function driverBwmCar()
{
return new BwmSportCar();
}
}
(10)客户端类
<?php spl_autoload_register(function ($className){
$className = str_replace('\\','/',$className);
include $className.".class.php";
}); use Factory\AbstractFactory\SportDriver; $type = new SportDriver();
$car = $type->driverBwmCar();
$string = $car->drive();
echo $string;