一、什么是抽象工厂模式

抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足以下条件:

系统中有多个产品族,而系统一次只可能消费其中一族产品。

同属于同一个产品族的产品可以使用。

产品族:位于不同产品等级结构中,功能相关联的产品组成的家族。下面例子的 汽车和空调就是两个产品树, 奔驰C200+格力某型号空调就是一个产品族, 同理, 奥迪A4+海尔某型号空调也是一个产品族。

二、类图

三、案例

产品类

// 汽车(抽象产品接口)

interface AutoProduct

{

public function dirve();

}

//奥迪A4(具体产品类)

class AudiA4Product implements AutoProduct

{

//获取汽车名称

public function dirve()

{

echo "开奥迪A4"."
";

}

}

//奔驰C200(具体产品类)

class BenzC200Product implements AutoProduct

{

//获取汽车名称

public function dirve()

{

echo "开奔驰C200"."
";

}

}

//空调(抽象产品接口)

interface AirCondition

{

public function blow();

}

//格力空调某型号(具体产品类)

class GreeAirCondition implements AirCondition

{

public function blow()

{

echo "吹格力空调某型号"."
";

}

}

//海尔空调某型号(具体产品类)

class HaierAirCondition implements AirCondition

{

public function blow()

{

echo "吹海尔空调某型号"."
";

}

}

工厂类

//工厂接口

interface Factory

{

public function getAuto();

public function getAirCondition();

}

//工厂A = 奥迪A4 + 海尔空调某型号

class AFactory implements Factory

{

//汽车

public function getAuto()

{

return new AudiA4Product();

}

//空调

public function getAirCondition()

{

return new HaierAirCondition();

}

}

//工厂B = 奔驰C200 + 格力空调某型号

class BFactory implements Factory

{

//汽车

public function getAuto()

{

return new BenzC200Product();

}

//空调

public function getAirCondition()

{

return new GreeAirCondition();

}

}

客户端类

//客户端测试代码

$factoryA = new AFactory();

$factoryB = new BFactory();

//A工厂制作车

$auto_carA = $factoryA->getAuto();

$auto_airA = $factoryA->getAirCondition();

//B工厂制作车

$auto_carB = $factoryB->getAuto();

$auto_airB = $factoryB->getAirCondition();

//开奥迪车+吹海尔空调

$auto_carA->dirve();

$auto_airA->blow(); //热的时候可以吹吹空调

//开奔驰车+吹格力空调;

$auto_carB->dirve();

$auto_airB->blow(); //热的时候可以吹吹空调

四、抽象工厂模式的组成

抽象工厂(AbstractFactory):确定工厂的业务范围。

具体工厂(ConcreteFactory):每个具体工厂对应一个产品族。具体工厂决定生产哪个具体产品对象。

抽象产品(AbstractProduct):同一产品等级结构的抽象类。

具体产品(ConcreteProduct):可供生产的具体产品。

工厂方法模式:

一个抽象产品类,可以派生出多个具体产品类。

一个抽象工厂类,可以派生出多个具体工厂类。

每个具体工厂类只能创建一个具体产品类的实例。

抽象工厂模式:

多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。

一个抽象工厂类,可以派生出多个具体工厂类。

每个具体工厂类可以创建多个具体产品类的实例。

三种工厂的比较

简单工厂 :用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)

工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)

抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)

参考

系列源地址

系列目录

php 抽象工厂模式,PHP设计模式(三)抽象工厂模式(Abstract Factory)相关推荐

  1. mysql工厂模式_设计模式-三种工厂模式实例

    1.简单工厂模式:代替new产生对象,产品的类型比较少时. 我们要获得三种不同的数据库对象,如Mysql,SQLserver,Oracle,它们拥有共同的特征,即可以进行抽象,简单工厂目的是将获得具体 ...

  2. 设计模式三—抽象工厂模式

    设计模式三-抽象工厂模式 一.定义 抽象工厂模式是工厂方法模式的进一步抽象.如果产品簇中只有一种产品,则退化为工厂方法模式. 二.原理图 三.代码实例 * 苹果和土豆是园丁1的杰作 * 葡萄和西红柿是 ...

  3. 浅析设计模式(三)——抽象工厂模式

    抽象工厂模式(Abstract-Factory,创建型模式) 本文的结构: 一.抽象工厂模式的定义 二.抽象工厂模式的参与者及其角色 三.抽象工厂模式的类图 四.抽象工厂模式的示例 五.参考 一.抽象 ...

  4. 抽象工厂模式_设计模式(3) 抽象工厂模式

    抽象工厂模式 优化抽象工厂 异步工厂 在学习抽象工厂模式前,先来回顾一下前面的简单工厂和工厂方法模式.简单工厂的职责非常简单:构造某个实体类型,然后把实例作为抽象类型返回: 工厂方法模式则进一步抽象出 ...

  5. 抽象工厂模式_设计模式系列—抽象工厂模式

    前言 23种设计模式速记 单例(singleton)模式 工厂方法(factory method)模式 23种设计模式快速记忆的请看上面第一篇,前面说完了工厂方法模式,我们发现工厂方法模式存在一个严重 ...

  6. python抽象工厂模式_Python设计模式之抽象工厂模式

    Python设计模式之抽象工厂模式 这篇文章主要为大家详细介绍了Python设计模式之抽象工厂模式,感兴趣的小伙伴们可以参考一下 python面向对象编程入门,我们需要不断学习进步 "&qu ...

  7. java设计模式---三种工厂模式之间的区别

    简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他 ...

  8. java设计模式---三种工厂模式

    工厂模式提供创建对象的接口. 工厂模式分为三类:简单工厂模式(Simple Factory), 工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory). GOF ...

  9. java 用映射写工厂类_java23种设计模式——三、工厂模式

    目录 工厂模式 工厂模式介绍 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式.著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见.因为 ...

  10. 什么java工厂模式_java的三种工厂模式是什么?

    java的三种工厂模式:1.简单工厂模式,提供一个创建对象实例的功能,而无须关心其具体实现:2.工厂方法模式:3.抽象工厂模式,提供一个创建一系列相关或相互依赖对象的接口,无须指定它们具体的类. 一. ...

最新文章

  1. air调用java,AIR2.0入门教程:与Java应用交互
  2. 【BZOJ】1630: [Usaco2007 Demo]Ant Counting(裸dp/dp/生成函数)
  3. c#一种存储结构解决动态平衡问题
  4. springboot + kafka
  5. 微信搜一搜又推出了新功能!搜“医保码”直达医保页面
  6. 一个简单的键值存储微服务
  7. 出现红字是电脑问题吗_苹果12还会出现信号不好的问题吗?
  8. 基于深度学习的计算机视觉技术在无人驾驶中的应用
  9. 【Python-3.5】绘制随机漫步图
  10. ❤️关于 idea 安装 Vue 插件后新建文件不显示 Vue Component 的问题及解决方法❤️
  11. Dijkstra(堆优)模板
  12. 阁下可知文言编程之精妙?文言文亦能编程!此诚年度最骚语言也,数天6K星...
  13. 遥控器进入鼠标模式,退出鼠标模式,上下左右移动和确认
  14. TRC文件转ASC文件
  15. PR转场 700+抖音视频转场素材包含PR调色预设和音效素材
  16. 腾格尔发新歌《遥远的地方》,成都邓秀菊自发红包朋友圈寻歌词
  17. bandizip右键选项设置方法步骤
  18. php 定义宏函数,汇编语言宏函数
  19. JavaScript中deferred对象浅析
  20. 2021年中国疫苗行业批签发批次、批签发量及行业发展前景分析:批签发批次增长,签发量下降,未来疫苗需求增加,集中度提高[图]

热门文章

  1. 我总是那么傻,爱的那么真,最后伤了自己:情感日志
  2. 掌财社:庄家为什么砸盘到跌停才出货
  3. 14nm 18核 Intel发烧友级CPU大降价了:只不到8000块了。
  4. matlab中for循环,while循环的基本使用。
  5. Oriented rcnn
  6. 嚼得菜根做得大事·《菜根谭》·十
  7. C300--HGU ONU 配置思路指导_方式1
  8. iOS开发 -- 一个被苹果下架的App,终于恢复上架
  9. LTI系统的频域分析法
  10. 【信号与系统】笔记(1)绪论