1. 作用

抽象工厂:为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。核心在于创建一组对象。

2. UML类图


参与者:

  • Product:为一类产品声明一个接口。
  • ConreteProduct:定义一个将被相应的具体工厂创建的产品对象。
  • Factory:声明一组创建抽象产品对象的接口操作。
  • ConcreteFactory:实现创建一组对象的接口。

3. 实现

  • 举例:长虹和TCL是两个非常著名的家电牌子,两个厂家都要生产电视机和洗衣机,假设现在两家公司合并了,但是品牌还是独立,用程序实现合并后生产产品的情况。
  • 类图:

    代码:

#include <iostream>using namespace std;/*******产品抽象类***********/
/*电视机*/
class Tv
{
public:virtual void showMe() = 0;
};/*洗衣机*/
class Washer
{
public:virtual void showMe() = 0;
};/*******产品具体类***********/
/*长虹电视机*/
class ChangHTv :public Tv
{
public:virtual void showMe(){cout << "长虹牌电视机\n";}
};/*长虹洗衣机*/
class ChangHWasher :public Washer
{
public:virtual void showMe(){cout << "长虹牌洗衣机\n";}
};/*TCL电视机*/
class TCLTv :public Tv
{
public:virtual void showMe(){cout << "TCL牌电视机\n";}
};/*TCL洗衣机*/
class TCLWasher :public Washer
{
public:virtual void showMe(){cout << "TCL牌洗衣机\n";}
};/*******工厂抽象类***********/
class Factory
{
public:virtual Tv* CreateTv() = 0;virtual Washer* CreateWasher() = 0;
};/*******具体工厂***********/
/***长虹工厂***/
class ChangHFactory:public Factory
{
public:virtual Tv* CreateTv(){return new ChangHTv;}virtual Washer* CreateWasher(){return new ChangHWasher;}
};/***TCL工厂***/
class TCLFactory :public Factory
{
public:virtual Tv* CreateTv(){return new TCLTv;}virtual Washer* CreateWasher(){return new TCLWasher;}
};/*****客户****/
void main()
{//建长虹工厂Factory *changhFac = new ChangHFactory;//造产品Tv *changhTv = changhFac->CreateTv();changhTv->showMe();Washer *changhWas = changhFac->CreateWasher();changhWas->showMe();//建TCL工厂Factory *tclFac = new TCLFactory;//造产品Tv *tclFacTv = tclFac->CreateTv();tclFacTv->showMe();Washer *tclFacWas = tclFac->CreateWasher();tclFacWas->showMe();delete changhFac;delete changhTv;delete changhWas;delete tclFac;delete tclFacTv;delete tclFacWas;
}
显示结果:
长虹牌电视机
长虹牌洗衣机
TCL牌电视机
TCL牌洗衣机
请按任意键继续. . .

4. 优缺点

  • 优点:
    封装性:同样将对象的创建过程与使用客户进行了隔离,知道接口就行。
    产品级扩展简单:比如需要增加一个牌子,那么只需增加一个具体工厂即可,抽象工厂不变。
  • 缺点:
    产品族扩展复杂:如果需要在产品族中增加一个产品,比如冰箱,那么需要在抽象工厂和具体工厂中都增加生存冰箱的接口。

PS:产品族和产品级:上述Tv和Washer构成一个产品族,而ChangHong和TCL构成一个产品级,具体感觉需要自己体会。

5. 适用场景

一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。这里的约束可以理解为:Tcl厂生产出来的TV和Washer肯定是TCL牌的,而长虹厂生产出的TV和Washer肯定是长虹牌的。品牌就是对具体产品的约束。

6. 总结

抽象工厂是工厂模式的升级版,工厂模式解决了一种对象的创建问题(产品类只有一个抽象类),而抽象工厂解决了一组对象的创建问题,有多少产品抽象类工厂抽象类中就有多少个抽象工厂方法。

设计模式之抽象工厂(C++)相关推荐

  1. 设计模式系列·抽象工厂模式

    前言 以小说的笔法写的设计模式系列文章,你绝对看得懂![首发于公众号:"聊聊代码"] 设计模式系列·王小二需求历险记(一) 设计模式系列·王小二需求历险记(二) 设计模式系列·封装 ...

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

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

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

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

  4. 设计模式复习-抽象工厂模式

    设计模式复习-抽象工厂模式 有两种硬件,PC和Phone,有两种系统,Windows和Linux,现在假设PC和Phone上全都能安装这两个系统,并且将来硬件不会在变化,但是系统可能需要扩展,比如扩展 ...

  5. 设计模式之四(抽象工厂模式第三回合)

    原文:设计模式之四(抽象工厂模式第三回合) 前言 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式最大的好处便是易于交换产品系列,由于具体工厂类,例如I ...

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

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

  7. 抽象工厂模式设计模式_抽象工厂设计模式解释

    抽象工厂模式设计模式 抽象工厂设计模式是工厂设计模式的另一种形式. 这种模式可以被视为"超级工厂"或"工厂工厂". 抽象工厂设计模式(属于"四人帮&q ...

  8. 设计模式-04抽象工厂模式

    设计模式-04抽象工厂模式 文章中涉及到的代码,请自行下载 https://gitee.com/pan_xiao_lei123/designmode.git 前面介绍的工厂方法模式中考虑的是一类产品的 ...

  9. C#设计模式(4)——抽象工厂模式

    C#设计模式(4)--抽象工厂模式 一.引言 在上一专题中介绍了工厂方法模式,工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码),而工厂方法 ...

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

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

最新文章

  1. hbuilderX的upx单位是什么鬼?
  2. CTO点名要搞个灰度发布系统,不慌!
  3. matlab x12,用MATLAB最优化工具箱的相关函数编程求解: minf(X)=x12+2x22一2x1x2—4x1,X0=[0,0]T...
  4. linux运行jar文件
  5. 第六章-Hadoop优化与发展
  6. nginx 上传 文件超时设置_Nginx大文件上传413和500问题排查总结
  7. python显示1000以内的斐波拉契数列_python实现斐波那契数列
  8. OpenGL——二维几何变换
  9. java 空心菱形
  10. 明星分手文案火了!为了营销 你们这些商家也是很努力啊...
  11. OpenShift 4之评估节点自消耗的系统资源
  12. 64位指针膨胀 java_64位JVM带来的问题及解决方案
  13. pythonname是什么意思_浅析Python __name__ 是什么
  14. 查看mysql中sql语句执行时间
  15. 升级Linux(Ubtun/CentOS)的OpenSSL(openssl-1.0.1h.tar.gz)
  16. 推荐三款windows下提高工作效率的软件(altrun、everything、ditto)
  17. python中seaborn报错These `style` levels are missing dashes解决办法
  18. c++链表(学生信息)
  19. BAS——一种正在崛起的网络安全技术
  20. 函数的length代表什么

热门文章

  1. 【学术信息】2019年期刊中科院分区-管理科学
  2. 使用PDF24Tools工具怎么将Word文档转化成PDF文件?
  3. Bessie Goes Moo
  4. linux testlink 安装,在ubuntu上安装TestLink指南
  5. 微信聊天小程序——(三、获取好友列表)
  6. 速腾聚创rs_lidar_16(Robosense)使用gmapping建图
  7. Android 应用兼容性最佳实践 | 中文教学视频
  8. 广西首位女云计算HCIE在南职院诞生
  9. 报错java.lang.ClassCastException: XXXXXXX.Application cannot be cast to android.app.MyApplicati
  10. SQL SERVER 2000数据库置疑 紧急模式