示例代码详见https://github.com/52fhy/design_patterns

抽象工厂

抽象工厂(Abstract Factory)是应对产品族概念的。比如说,每个汽车公司可能要同时生产轿车、跑车、货车、客车,那么每一个工厂都要有创建轿车,货车和客车的方法。

在学习抽象工厂具体实例之前,应该明白两个重要的概念:产品族产品等级

产品等级:同一个产品的不同分类或者组成。

产品族:是指位于不同产品等级结构中,功能相关联的产品组成的家族。

例如:汽车分奔驰、宝马,奔驰下面还有跑车、MINI车等等。其中奔驰就是产品族,跑车、MINI车是产品等级。

再例如:AMD的主板、芯片组、CPU组成一个家族,Intel的主板、芯片组、CPU组成一个家族。而这两个家族都来自于三个产品等级:主板、芯片组、CPU。

抽象工厂是汽车生产工厂的抽象,工厂方法是一个汽车工厂里每种汽车型号的抽象;简单工厂和抽象工厂含义一样,只是产品型号是固定的。

应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。

抽象工厂UML图:

简单工厂需要有4个角色:

  • Product接口类:用于定义产品规范,例如ProductA、ProductB,抽象工厂有多个Product接口类;
  • 具体的产品实现,例如ProductA1、ProductA2;
  • 抽象工厂类IFactory:用于规范每个工厂;
  • 具体产品族创建的工厂,例如Factory1、Factory2。

对应到汽车工厂的例子,这么解释:

1、汽车厂(抽象工厂)分为奔驰汽车厂(F1)、宝马汽车厂(F2);

2、每个汽车厂都能生产:跑车(ProductA)、Mini车(ProductB);

3、可以有产品:奔驰跑车(A1)、宝马跑车(A2)、奔驰MINI(B1)、宝马MINI(B2);

4、那么奔驰汽车厂(F1)可以生产奔驰跑车(A1)、奔驰MINI(B1);

5、跑车(ProductA)、Mini车(ProductB)可以有自己的一些行为(operation):例如driver()playMusic()

其中:奔驰车、宝马车就是产品族,跑车、MINI车是产品等级。

对应到芯片工厂的例子,这么解释:

1、芯片厂商(抽象工厂)分为Intel厂(F1)、AMD厂(F2);

2、每个芯片厂商都能生产:CPU(ProductA)、Mainboard(ProductB);

3、可以有产品:Intel CPU(A1)、AMD CPU(A2)、Intel主板(B1)、AMD主板(B2);

4、那么Intel厂(F1)可以生产Intel CPU(A1)、Intel主板(B1);

5、CPU(ProductA)、Mainboard(ProductB)可以有自己的一些行为(operation):例如compute()installCPU()

下面以汽车生产为例:

跑车:

namespace Yjc\AbstractFactory;

interface IProductSportCar
{
public function driver();
}

MINI车:

namespace Yjc\AbstractFactory;

interface IProductMiniCar
{
public function driver();
public function playMusic();
}

实现的跑车产品:

namespace Yjc\AbstractFactory;

class BenzSport implements IProductSportCar
{
public function driver()
{
echo 'driver';
}
} class BmwSport implements IProductSportCar
{
public function driver()
{
echo 'driver';
}
}

实现的MINI车产品:

namespace Yjc\AbstractFactory;

class BenzMini implements IProductMiniCar
{
public function driver()
{
echo 'driver';
} public function playMusic()
{
echo 'playMusic';
}
} class BmwMini implements IProductMiniCar
{
public function driver()
{
echo 'driver';
} public function playMusic()
{
echo 'playMusic';
}
}

抽象工厂(能生产各种类型车):

namespace Yjc\AbstractFactory;

interface IFactory
{
public function makeMiniCar();//Mini车
public function makeSportCar();//跑车
}

抽象工厂实现:

namespace Yjc\AbstractFactory;

//宝马工厂
class FactoryBmw implements IFactory
{ public function makeMiniCar()
{
return new BmwMini();
} public function makeSportCar()
{
return new BmwSport();
}
} //奔驰工厂
class FactoryBenz implements IFactory
{ public function makeMiniCar()
{
return new BenzMini();
} public function makeSportCar()
{
return new BenzSport();
}
}

测试:

//生产奔驰跑车
$benzFactory = new FactoryBenz();
$benzCar = $benzFactory->makeSportCar();
$benzCar->driver(); //生产宝马MINI
$bmwFactory = new FactoryBmw();
$bmwCar = $bmwFactory->makeMiniCar();
$bmwCar->playMusic();

简单工厂、工厂方法、抽象工厂总结:

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

以上三种工厂方法在等级结构和产品族这两个方向上的支持程度不同。所以要根据情况考虑应该使用哪种方法。

参考:

1、设计模式:简单工厂、工厂方法、抽象工厂之小结与区别 - superbeck的专栏 - 博客频道 - CSDN.NET

http://blog.csdn.net/superbeck/article/details/4446177

2、《JAVA与模式》之抽象工厂模式 - java_my_life - 博客园

http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html

PHP设计模式:抽象工厂的更多相关文章

  1. 设计模式——抽象工厂模式及java实现

    设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...

  2. 5. 星际争霸之php设计模式--抽象工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  3. linkin大话设计模式--抽象工厂

    linkin大话设计模式--抽象工厂 在前面讲到的简单工厂里面虽然实现了我们那个类和其中的依赖的解耦,但是在产生我们需要的依赖的那个工厂里面还是和具体的产品类耦合了  现在要是还想彻底解耦的话怎么办呢 ...

  4. 设计模式——抽象工厂(Abstract Factory)

    Abstract Factory 抽象工厂模式(创建型模式): new的问题:实现依赖,不能应变应对“具体实例化类型”的变化. 解决思路:--封装变化点:哪里变化,封装哪里           - - ...

  5. JAVA设计模式--抽象工厂模式

    抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的 ...

  6. 深入浅出设计模式——抽象工厂模式(Abstract Factory)

    模式动机在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法.但是有时候我们需要一个工厂可 ...

  7. C#设计模式——抽象工厂

    一.引言 我相信看到这段文字的人,都具备了良好的技术功底.但是对于自己编写的代码总是充满抱怨,希望能够将自己编写的代码如同房子一般先进行有效 的设计,然后在进行建设.那么这篇文章能够给你一些思路,这里 ...

  8. 24种设计模式--抽象工厂模式【Abstract Factory Pattern】

    女娲造人,人是造出来了,世界是热闹了,可是低头一看,都是清一色的类型,缺少关爱.仇恨.喜怒哀乐等情绪,人类的生命太平淡了,女娲一想,猛然一拍脑袋,忘记给人类定义性别了,那怎么办?抹掉重来,然后就把人类 ...

  9. C++设计模式——抽象工厂模式

    问题描述 之前讲到了C++设计模式——工厂方法模式,我们可能会想到,后期产品会越来越多了,建立的工厂也会越来越多,工厂进行了增长,工厂变的凌乱而难于管理:由于工厂方法模式创建的对象都是继承于Produ ...

  10. 设计模式 | 抽象工厂模式(abstract factory)

    定义: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类. 结构:(书中图,侵删) 这个图相对来说有一点点复杂,其实就是在工厂方法模式的基础上做了一些扩展,工厂方法模式只用于生成一种 ...

随机推荐

  1. 0基础搭建Hadoop大数据处理-环境

    由于Hadoop需要运行在Linux环境中,而且是分布式的,因此个人学习只能装虚拟机,本文都以VMware Workstation为准,安装CentOS7,具体的安装此处不作过多介绍,只作需要用到的知 ...

  2. ElasticSearch5在Ubuntu系统下的安装和Java调用

    ElasticSearch是开源搜索平台的新成员,实时数据分析的神器.可以理解为作为搜索的数据库,可以提供搜索功能.对比关系型数据库,具有以下的相似关系: 关系型数据库 数据库 表 行 列 Elast ...

  3. js闭包绑定元素

    闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. 作为一个函数变量的一个引用,当函数返回时,其处于激活状 ...

  4. pdf.js实现在HTML下直接浏览pdf文档,无需插件即可实现

    近期,有一个朋友做B端,服务器存了大量的金融类数据,很多都是pdf文档,他现在的做法是,先将pdf文档转换成flash,再放到浏览器上给用户浏览,但是他告诉我,这种体验太差了,而且很好资源,空间已经快 ...

  5. 跨交换机相同vlan内的通信(trunk模式)

    当一个公司的小型局域网内部,处于不同楼层的主机处在同一个虚拟局域网内,连接到不同的交换机上,这时候就需要相同虚拟局域网内部的主机进行跨交换机进行通信. 通过设置交换机之间相连接的端口开启trunk模式 ...

  6. 用ArrayList(解决约瑟夫问题)

    约瑟夫问题(Josephus problem)又称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的算法中,约瑟夫问题类似问题又称为约瑟夫环."丢手绢问题". 据 ...

  7. 省市区三级联动(jquery+ajax)(封装和不封装两种方式)-----2017-05-15

    首先,要实现如下图效果, 1.要理清思路: 先做出三个下拉菜单----根据第一个下拉菜单的value值获取第二个下拉列表的内容,第三个同理. 2.用到的数据库表:Chinastates表 规律:根据国 ...

  8. Sql Server + ADO.NET

    MsSql-http://www.cnblogs.com/zhangwei595806165/archive/2012/02/23/2364746.html 协议:Shared Memory :效率最 ...

  9. Tomcat Server处理一个http请求过程

    假设来自客户端的请求为: http://localhost:8080/lizhx/lizhx_index.jsp 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Conne ...

  10. [转]JAVA的动态代理机制及Spring的实现方式

    JAVA 代理实现 代理的实现分动态代理和静态代理,静态代理的实现是对已经生成了的JAVA类进行封装. 动态代理则是在运行时生成了相关代理累,在JAVA中生成动态代理一般有两种方式. JDK自带实现方 ...