![](https://source.unsplash.com/random/1680x200) ## 抽象工厂模式(Abstract Factory) **概念** 抽象工厂模式提供一个创建一系统相关或相互依赖对象的接口,而无需指定它们具体的类。 抽象工厂模式是工厂方法模式的升级版本,他用来`创建一组相关或者相互依赖的对象`。他与工厂方法模式的区别就在于,__工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构__。 在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。 **主要角色** **抽象工厂(Abstract Factory)角色**:它声明一个创建抽象产品对象的接口。通常以接口或抽象类实现,所有的具体工厂类必须实现这个接口或继承这个类。 **具体工厂(Concrete Factory)角色** :实现创建产品对象的操作。客户端直接调用这个角色创建产品的实例。这个角色包含有选择合适的产品对象的逻辑。通常使用具体类实现。 **抽象产品(Abstract Product)角色**:声明一类产品的接口。它是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。 **具体产品(Concrete Product)角色**:实现抽象产品角色所定义的接口,定义一个将被相应的具体工厂创建的产品对象。其内部包含了应用程序的业务逻辑。 **UML图** ![](https://img.kancloud.cn/3f/41/3f41290c21ef6c79a0735bad25783880_835x574.jpg) **简单实例** ``` <?php /** * 抽象工厂模式 2010-05-28 sz * @author phppan.p#gmail.com * @package design pattern */ /** * 抽象工厂 */ interface AbstractFactory { /** * 创建等级结构为A的产品的工厂方法 */ public function createProductA(); /** * 创建等级结构为B的产品的工厂方法 */ public function createProductB(); } /** * 具体工厂1 */ class ConcreteFactory1 implements AbstractFactory{ public function createProductA() { return new ProductA1(); } public function createProductB() { return new ProductB1(); } } /** * 具体工厂2 */ class ConcreteFactory2 implements AbstractFactory{ public function createProductA() { return new ProductA2(); } public function createProductB() { return new ProductB2(); } } /** * 抽象产品A */ interface AbstractProductA { /** * 取得产品名 */ public function getName(); } /** * 抽象产品B */ interface AbstractProductB { /** * 取得产品名 */ public function getName(); } /** * 具体产品A1 */ class ProductA1 implements AbstractProductA { private $_name; public function __construct() { $this->_name = 'product A1'; } public function getName() { return $this->_name; } } /** * 具体产品A2 */ class ProductA2 implements AbstractProductA { private $_name; public function __construct() { $this->_name = 'product A2'; } public function getName() { return $this->_name; } } /** * 具体产品B1 */ class ProductB1 implements AbstractProductB { private $_name; public function __construct() { $this->_name = 'product B1'; } public function getName() { return $this->_name; } } /** * 具体产品B2 */ class ProductB2 implements AbstractProductB { private $_name; public function __construct() { $this->_name = 'product B2'; } public function getName() { return $this->_name; } } /** * 客户端 */ class Client { /** * Main program. */ public static function main() { self::run(new ConcreteFactory1()); self::run(new ConcreteFactory2()); } /** * 调用工厂实例生成产品,输出产品名 * @param $factory AbstractFactory 工厂实例 */ public static function run(AbstractFactory $factory) { $productA = $factory->createProductA(); $productB = $factory->createProductB(); echo $productA->getName(), '<br />'; echo $productB->getName(), '<br />'; } } Client::main(); ```