php设计模式之一工厂模式--抽象工厂模式
最近在学习设计模式,很多地方还理解的不够。在这里记录一下自己学习的东西,方便自己以后查看和理解,同时也给正在学这部分的同学提供一点参考。
工厂模式的几种形态:
1、简单工厂模式(Simple Factory) |又叫做 静态工厂方法模式(Static Factory Method)
2、工厂方法模式(Factory Method) |又叫做 多态性工厂模式(Polymorphic Factory)
3、抽象工厂模式(Abstract Factory) |又叫做 工具箱模式(ToolKit)
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。
抽象工厂模式包含如下角色:
- AbstractFactory:抽象工厂
- ConcreteFactory:具体工厂
- AbstractProduct:抽象产品
- Product:具体产品
<?php /** * 抽象工厂模式 */ //AbstractFactory:抽象工厂 abstract class AbstractProductA { abstract public function use(); } //ConcreteFactory:具体工厂 class ProductA1 extends AbstractProductA { public function use(){ var_dump('productA1'); } } class ProductA2 extends AbstractProductA { public function use(){ var_dump('productA2'); } } //AbstractProduct:抽象产品 abstract class AbstractProductB { abstract public function eat(); } //Product:具体产品 class ProductB1 extends AbstractProductB { public function eat() { var_dump('productB1'); } } class ProductB2 extends AbstractProductB { public function eat() { var_dump('productB2'); } } abstract class AbstractFactory { abstract public function createProductA(); abstract public function createProductB(); } class ConcreteFactory1 extends AbstractFactory { public function createProductA() { return new ProductA1(); } public function createProductB() { return new ProductB1(); } } class ConcreteFactory2 extends AbstractFactory { public function createProductA() { return new ProductA2(); } public function createProductB() { return new ProductB2(); } } $a=new ConcreteFactory1(); $b=$a->createProductA(); $b->use(); $c=new ConcreteFactory2(); $d=$c->createProductB(); $d->eat();
三种工厂模式总结:
1.三种在形式和特点上极为相似,最终目的都是解耦。将对象的创建过程进行封装,使客户端可以直接得到对象,而不用去关心如何创建对象。
2.对比
工厂方法模式:用于创建复杂对象。(单点食物)
抽象工厂模式:用于创建一组相关或相互依赖的复杂对象。(买套餐)
工厂方法创建一般只有一个方法,创建一种产品。抽象工厂一般有多个方法,创建一系列产品。
我们不必去在意模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了,而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。
浙公网安备 33010602011771号