一、什么是抽象工厂模式

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

  1. 系统中有多个产品族,而系统一次只可能消费其中一族产品。
  2. 同属于同一个产品族的产品可以使用。

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

二、类图

三、案例

产品类
// 汽车(抽象产品接口)
interface AutoProduct
{
public function dirve();
} //奥迪A4(具体产品类)
class AudiA4Product implements AutoProduct
{
//获取汽车名称
public function dirve()
{
echo "开奥迪A4"."<br>";
}
} //奔驰C200(具体产品类)
class BenzC200Product implements AutoProduct
{
//获取汽车名称
public function dirve()
{
echo "开奔驰C200"."<br>";
}
}
//空调(抽象产品接口)
interface AirCondition
{
public function blow();
} //格力空调某型号(具体产品类)
class GreeAirCondition implements AirCondition
{
public function blow()
{
echo "吹格力空调某型号"."<br>";
}
} //海尔空调某型号(具体产品类)
class HaierAirCondition implements AirCondition
{
public function blow()
{
echo "吹海尔空调某型号"."<br>";
}
}
工厂类
//工厂接口
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(); //热的时候可以吹吹空调

四、抽象工厂模式的组成

  1. 抽象工厂(AbstractFactory):确定工厂的业务范围。
  2. 具体工厂(ConcreteFactory):每个具体工厂对应一个产品族。具体工厂决定生产哪个具体产品对象。
  3. 抽象产品(AbstractProduct):同一产品等级结构的抽象类。
  4. 具体产品(ConcreteProduct):可供生产的具体产品。

工厂方法模式:

  • 一个抽象产品类,可以派生出多个具体产品类。
  • 一个抽象工厂类,可以派生出多个具体工厂类。
  • 每个具体工厂类只能创建一个具体产品类的实例。

抽象工厂模式:

  • 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
  • 一个抽象工厂类,可以派生出多个具体工厂类。
  • 每个具体工厂类可以创建多个具体产品类的实例。

    三种工厂的比较

  • 简单工厂 :用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)
  • 工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)
  • 抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)

参考

系列源地址

WilburXu/design_pattern

系列目录

  1. PHP 设计模式概述
  2. PHP设计模式(一)简单工厂模式 (Simple Factory For PHP)
  3. PHP设计模式(二)工厂方法模式(Factory Method)
  4. PHP设计模式(三)抽象工厂模式(Abstract Factory)
  5. PHP设计模式(四)单例模式(Singleton)

原文地址:https://segmentfault.com/a/1190000016659904

PHP设计模式(三)抽象工厂模式(Abstract Factory)的更多相关文章

  1. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...

  2. 【设计模式】抽象工厂模式 Abstract Factory Pattern

    简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...

  3. 【UE4 设计模式】抽象工厂模式 Abstract Factory Pattern

    概述 描述 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类:具体的工厂负责实现具体的产品实例 抽象工厂中每个工厂可以创建多种产品(如苹果公司生产iPhone.iPad): 工厂方法 ...

  4. 二十四种设计模式:抽象工厂模式(Abstract Factory Pattern)

    抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Messag ...

  5. 设计模式之抽象工厂模式(Abstract Factory Pattern)

    一.抽象工厂模式的由来 抽象工厂模式,最开始是为了解决操作系统按钮和窗体风格,而产生的一种设计模式.例如:在windows系统中,我们要用windows设定的按钮和窗体,当我们切换Linux系统时,要 ...

  6. 设计模式 笔记 抽象工厂模式 Abstract Factory

    //---------------------------15/04/09---------------------------- //Abstract Factory 抽象工厂----对象创建型模式 ...

  7. .NET设计模式(2):1.2 抽象工厂模式(Abstract Factory)

    概述 抽象工厂模式(Abstract Factory)是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口 ...

  8. 设计模式 - 抽象工厂模式(abstract factory pattern) 具体解释

    抽象工厂模式(abstract factory pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/2709 ...

  9. 抽象工厂模式(Abstract Factory)C#实例

    抽象工厂模式(Abstract Factory)C#实例 本文出处http://www.dofactory.com/net/abstract-factory-design-pattern 一.场景描述 ...

  10. 浅谈C++设计模式之抽象工厂(Abstract Factory)

    抽象工厂(Abstract Factory)模式是为了提供一系列相关或相互依赖对象的接口.对象创建型模式的一种. 客户Client 抽象工厂接口AbstractFactory 抽象工厂的实现类Conc ...

随机推荐

  1. arttemplate模板引擎里面多层循环

    要使用支持原生js的插件: 代码截图: json数据 { "list": [ { "name": "学历层次", "item&qu ...

  2. Eclipse中使用GIT将已提交到本地的文件上传至远程仓库

    GIT将已提交到本地的文件上传至远程仓库: 1.  右击项目——Team——Push to Upstream,即可将已保存在本地的文件上传推至GIT远程仓库.

  3. 如何在使用layer.prompt在输入值为空的情况下点击确定继续执行逻辑?

    突然发现在使用LayUI时,用到弹出层layer.prompt时,如果文本框输入值是空的话点击确定没有反应,不能向下执行. 但是我又需要在这种情况下去继续执行判断或逻辑时该怎么做?? 示例:原代码如下 ...

  4. codevs 3945 完美拓印 (KMP)

    题目大意:给你一个神奇的印章,他左右下三个面都是直的,上面是凸凹不平的面(凸凹都平行于别的面).然后给你一个轮廓线,如果一个面能与轮廓线完全重合,可以把印章的这个沿着轮廓线拓印,求所有的拓印方案. 把 ...

  5. django-1-框架介绍

    <<<python虚拟环境>>> 用django框架做web开发必须要用到python虚拟环境,而且一个虚拟环境只能创建一个django项目,如果创建多个djang ...

  6. GitHub上传项目,使用desktop(客户端)教程

    GitHub上传项目,使用desktop(客户端)教程  搜索“GitHub上传项目”,能得到很多相关的文章教程,里面讲的都特别麻烦,要弄什么ssh之类的,可算是吓坏了我,使我非常的怀疑为什么GitH ...

  7. C/C++ Swap without using extra variable

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50255379 对于可以线性运算的变量, ...

  8. Session小案例-----简单购物车的使用

    Session小案例-----简单购物车的使用 同上篇一样,这里的处理请求和页面显示相同用的都是servlet. 功能实现例如以下: 1,显示站点的全部商品 2.用户点击购买后,可以记住用户选择的商品 ...

  9. 安卓APP载入HTML5页面解决方式总结

    因为H5页面在移动端的兼容性及扩展性方面体现出来的优势,又兼得APP中植入H5页面相应用的灵活性有大大的提升(如活动.游戏的更新等).APP开发不可避免的须要载入一些H5页面.但安卓client对网页 ...

  10. 单片机: EEPROM和串口通信

    名称:IIC协议 EEPROM24c02 通过串口通信存数读取数据 内容:此程序用于检測EEPROM性能,測试方法例如以下:写入24c02一个数据,然后在内存中改变这些数据. 掉电后主内存将失去这些信 ...