1.概述

使用设计模式可以提高代码的可复用性、可扩充性和可维护性。抽象工厂模式(Abstract Factory Pattern)属于创建型模式,为创建一组相关或者相互依赖的对象(产品族)提供一个抽象类接口,而无需指定它们的具体类。。产品族的定义是:某个具体工厂生产的所有类型的产品,比如定义了一个抽象工厂接口A,它可以生产三种产品:p1、p2、p3,而这三个产品就叫一个产品族。

抽象工厂模式可以说是工厂方法模式的升级版,当需要创建的产品有多个产品族时使用抽象工厂模式是比较好的选择。那什么是多个产品族呢?拿我们在设计模式(四)——简单工厂模式、设计模式(五)——工厂方法模式中学习的生产比萨的例子来举例。我们一直都是在一个比萨店生产三种不同口味的比萨,但是不同地方的比萨店生产的同一品种的比萨点使用的原料可能存在差异。比如纽约和芝加哥的比萨店都在生产蛤蜊比萨,但是纽约喜欢薄的且靠近大海,所以使用较小的面团和新鲜的蛤蜊,芝加哥使用较大的面团和冷冻的比萨。现在使用工厂方法模式来生产原料已经满足不了需求,因为生产对象的总类太多,这一篇文章我们就用抽象工厂模式来解决这一问题。

抽象工厂模式类图结构:

在抽象工厂模式中有如下角色:
AbstractFactory:抽象工厂类,它声明了用来创建不同产品的方法。
ConcreteFactory:具体工厂类,实现抽象工厂中申明的创建产品的方法。
AbstractProduct:抽象产品类,为每种产品声明抽象描述方法。比如上图的AbstractProductA和 AbstractProductB。
ConcreteProduct:具体产品类,定义具体工厂生产的具体产品,并实现抽象产品类中申明的抽象描述方法。

2.抽象工厂模式简单实现

下面以C++来实现。首先定义抽象产品类,分别为面团Dough和蛤蜊Clam:

//面团
class Dough{
public:virtual string getDescription() = 0;
};//蛤蜊
class Clam{
public:virtual string getDescription() = 0;
};

现在实现纽约和芝加哥两地比萨店使用的不同的具体原料类:

//纽约面团
class NewYorkDough:public Dough{
public:virtual string getDescription() {return "纽约薄面团";};
};
//纽约蛤蜊
class NewYorkClam:public Clam{
public:virtual string getDescription() {return "纽约新鲜蛤蜊";};
};//芝加哥面团
class ChicagoDough:public Dough{
public:virtual string getDescription() {return "芝加哥厚面团";}
};
//芝加哥面团
class ChicagoClam:public Clam{
public:virtual string getDescription() {return "芝加哥冷冻蛤蜊";}
};

有了抽象产品类和具体产品类,现在来完成抽象工厂和具体工厂的设计和实现。

//抽象工厂
class AbstractFactory {
public:virtual Dough* createDough() = 0;virtual Clam* createClam() = 0;
};//具体生产纽约比萨原料工厂
class NewYorkFactory :public AbstractFactory {
public:Dough* createDough() {return new NewYorkDough;}Clam* createClam() {return new NewYorkClam;}
};
//具体生产芝加哥比萨原料工厂
class ChicagoFactory :public AbstractFactory {
public:Dough* createDough() {return new ChicagoDough;}Clam* createClam() {return new ChicagoClam;}
};

客户端代码,使用工厂来生产具体的比萨原料。

#include <iostream>
#include <string>
using namespace std;
int main() {AbstractFactory* af1 = new NewYorkFactory;Dough* dough1 = af1->createDough(); //生产纽约薄面团cout << dough1->getDescription() << endl;Clam* clam1 = af1->createClam();    //生产纽约新鲜蛤蜊cout << clam1->getDescription() << endl;AbstractFactory* af2 = new ChicagoFactory;Dough* dough2 = af2->createDough(); //生产芝加哥厚面团cout << dough2->getDescription() << endl;Clam* clam2 = af2->createClam();    //生产芝加哥冷冻蛤蜊cout << clam2->getDescription() << endl;system("pause");
}

程序运行结果:

纽约薄面团
纽约新鲜蛤蜊
芝加哥厚面团
芝加哥冷冻蛤蜊

3.抽象工厂模式的应用场景和优缺点

应用场景:
(1)一个系统不依赖于产品族实例如何被创建、组合和表达的细节。如本文例子中一个比萨店生产的比萨原料是一个产品族。
(2)系统中有多于一个产品族。一个产品族存在存在着多个抽象类,如蛤蜊基类、面团基类等。并且产品族中分属各个抽象基类的各个实现类之间存在着一定的关联或者约束,就可以使用抽象工厂模式。假如各个抽象类的实现类之间不存在关联或约束,则使用多个独立的工厂来对产品进行创建,则更合适一点,比如我们在设计模式(五)——工厂方法模式中使用工厂方法模式来创建不同口味的比萨。

优点:
抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。

缺点:
产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则需要修改抽象工厂类和生产该产品族的具体工厂类。所以使用抽象工厂模式时,对产品族的划分是非常重要的。

4.抽象工厂模式与工厂方法和简单工厂模式的对比

无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,在抽象工厂类中加入了一个新方法后,由于抽象工厂类中的产品构成了不同抽象基类中具体产品,具体工厂类生产的产品就组成了一个产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使提供的产品不再构成产品族之后,它就演变成了工厂方法模式。

所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。

参考文献

[1]23种设计模式(3):抽象工厂模式
[2]设计模式(十三)抽象工厂模式

设计模式(6)——抽象工厂模式(Abstract Factory Pattern,创建型)相关推荐

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

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

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

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

  3. Net设计模式之抽象工厂模式(Abstract Factory Pattern)(1)

    一.抽象工厂模式简介(Bref Introduction) 抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或者相互依赖对象的接口,而无需制定他们的具体类.优点 ...

  4. 设计模式剖析——抽象工厂模式Abstract Factory Pattern

    含义 与工厂方法模式相比,概念有些不一样.有抽象零件.抽象产品.抽象工厂.用零件来组装出产品,组装出的产品才是完整的产品. 既然一个完整产品需要多个零件,那么每种具体工厂自然也需要可以同时生产出多种零 ...

  5. 设计模式 - 抽象工厂模式(abstract factory pattern) 详解

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

  6. 抽象工厂模式 Abstract Factory Pattern

    源地址 抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建 ...

  7. 抽象工厂模式-Abstract Factory Pattern

    抽象工厂模式-Abstract Factory Pattern 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类.抽 ...

  8. 设计模式之抽象工厂模式(Abstract Factory)摘录

    面向对象系统的分析和设计实际上追求的就是两点:高内聚(Cohesion)和低耦合(Coupling). 23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.Fa ...

  9. 设计模式之抽象工厂模式---abstract factory

    模式的介绍 模式的定义 Provide an interface for creating families of related or dependent objects without speci ...

  10. 极速理解设计模式系列:10.抽象工厂模式(Abstract Factory Pattern)

    五个角色:抽象产品角色(AbstractProduct).具体产品角色(Product).抽象工厂角色(AbstractFactory).具体工厂角色(ConcreteFactory).客户端(Cli ...

最新文章

  1. Java线程的两种实现方式
  2. MCU实战经验:多种的按键处理
  3. python提取图像的每一帧
  4. 佛山将设立总规模100亿元的“通济基金” 缓解上市公司困境
  5. Dalvik解释器源码到VMP分析
  6. maven设置jdk版本(全局设置和工程设置)
  7. J2ME最佳实践之联网开发-编写反应灵敏的联网提示界面
  8. CAS Client 3.2.1 配置详解
  9. 贪心算法之取手套问题(牛客)
  10. 春眠不觉晓,Kubernetes知多少
  11. Leaning perl 第2章练习题答案
  12. 使用emacs + cscope + ecb替代source insight
  13. 黑马程序员pink老师前端入门教程,零基础必看的JavaScript基础语法视频教程(jQuery2)
  14. codeIgniter 4升级使用
  15. 是一套基于PHP,zhw_cms 中和网企业建站系统这是一套基于PHP的快速 ,主要适用于中小 建立 WEB(ASP,PHP,...) 267万源代码下载- www.pudn.com...
  16. html怎样调节字间距,css怎么调整字间距?
  17. 你的声音价值百万,教你六个利用声音赚钱的方法
  18. windows实战Git环境配置msysGit+TortoiseGit(zz)
  19. java获取前五分钟时间,java计算下一个整5分钟时间点
  20. Spring Boot使用ApplicationEvent来实现事件发布订阅功能(美女一个都不能少,都要通知到) - 第420篇

热门文章

  1. 图解 hexo + github 从零快速 搭建个人博客 windowss
  2. 如何解决Greenplum中无法通过标准命令修复的元数据错误
  3. http 和 https 区别?
  4. 苹果发布新应用Find My Friends,轻松追踪朋友和家人的所在位置
  5. 破解成功!iMac成功运行WindowsXP系统
  6. 编译在arm版本的Valgrind-转
  7. printf 打印 文件名 函数名 行号
  8. [Java] 蓝桥杯ALGO-122 算法训练 未名湖边的烦恼
  9. [Java] 蓝桥杯 BEGIN-3 入门训练 圆的面积
  10. [swift] LeetCode 62. Unique Paths