学习总结

(1)抽象工厂模式结构与工厂方法模式结构类似,不同之处在于,一个具体工厂可以生产多种同类相关的产品。

  • 抽象工厂模式的优点:

    • 工厂方法用于创建客户所需产品,同时向客户隐藏某个具体产品类将被实例化的细节,用户只需关心所需产品对应的工厂;
    • 新加入产品系列时,无需修改原有系统,增强了系统的可扩展性,符合开闭原则。
  • 抽象工厂模式的缺点:
    • 在已有产品系列中添加新产品时需要修改抽象层代码,对原有系统改动较大,违背开闭原则
  • 适用环境:
    • 一系列/一族产品需要被同时使用时,适合使用抽象工厂模式;
    • 产品结构稳定,设计完成之后不会向系统中新增或剔除某个产品

抽象工厂模式中,如果需要新增加一个系列的产品,比如足球系列,只需增加一族新的具体产品类(抽象和具体)并提供一个对应的工厂类即可。但是,如果要在已有的产品族里增加另一个产品,比如Jungle打篮球,除了需要篮球和篮球衣外,Jungle还想换双篮球鞋,这时候该怎么办呢?是不是要去修改BasketballFactory呢?

文章目录

  • 学习总结
  • 一、抽象工厂模式
    • 1.1 抽象工厂模式结构
    • 1.2 抽象工厂模式的栗子
  • 二、AbstractFactory.h头文件
  • 三、客户端代码

一、抽象工厂模式

抽象工厂模式,其抽象程度更高,每一个具体工厂可以生产一组相关的具体产品对象。
抽象工厂模式的定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。

1.1 抽象工厂模式结构

抽象工厂模式结构与工厂方法模式结构类似,不同之处在于,一个具体工厂可以生产多种同类相关的产品:

  • 抽象工厂(AbstractFactory):所有生产具体产品的工厂类的基类,提供工厂类的公共方法;
  • 具体工厂(ConcreteFactory):生产具体的产品
  • 抽象产品(AbstractProduct):所有产品的基类,提供产品类的公共方法
  • 具体产品(ConcreteProduct):具体的产品类


结合抽象工厂模式定义和UML,可以看到具体工厂ConcreteFactory_A可以生产两种产品,分别是ConcreteProduct_A_1ConcreteProduct_A_2,另一个具体工厂ConcreteFactory_B同理。客户端使用时,需要声明一个抽象工厂AbstractFactory和两个抽象产品AbstractProduct

1.2 抽象工厂模式的栗子

篮球保管室可以提供篮球和篮球衣,足球保管室可以提供足球和足球衣。Jungle只要根据心情去某个保管室,就可以换上球衣、拿上球,然后就可以愉快地玩耍了。

对应的UML实例图:

二、AbstractFactory.h头文件

//抽象工厂类
class AbstractFactory
{public:virtual AbstractBall *getBall() = 0;virtual AbstractShirt *getShirt() = 0;
};

注意上面的抽象工厂类中定义两个纯虚函数。

//抽象产品类AbstractBall
class AbstractBall
{public:AbstractBall(){}//抽象方法:void play(){};
};//具体产品类Basketball
class Basketball :public AbstractBall
{public:Basketball(){play();}//具体实现方法void play(){printf("Jungle play Basketball\n\n");}
};//具体产品类Football
class Football :public AbstractBall
{public:Football(){play();}//具体实现方法void play(){printf("Jungle play Football\n\n");}
};//抽象产品类AbstractShirt
class AbstractShirt
{public:AbstractShirt(){}//抽象方法:void wearShirt(){};
};//具体产品类BasketballShirt
class BasketballShirt :public AbstractShirt
{public:BasketballShirt(){wearShirt();}//具体实现方法void wearShirt(){printf("Jungle wear Basketball Shirt\n\n");}
};//具体产品类FootballShirt
class FootballShirt :public AbstractShirt
{public:FootballShirt(){wearShirt();}//具体实现方法void wearShirt(){printf("Jungle wear Football Shirt\n\n");}
};//抽象工厂类
class AbstractFactory
{public:virtual AbstractBall *getBall() = 0;virtual AbstractShirt *getShirt() = 0;
};//具体工厂类BasketballFactory
class BasketballFactory :public AbstractFactory
{public:BasketballFactory(){printf("BasketballFactory\n");}AbstractBall *getBall(){printf("Jungle get basketball\n");return new Basketball();}AbstractShirt *getShirt(){printf("Jungle get basketball shirt\n");return new BasketballShirt();}
};//具体工厂类BasketballFactory
class FootballFactory :public AbstractFactory
{public:FootballFactory(){printf("FootballFactory\n");}AbstractBall *getBall(){printf("Jungle get football\n");return new Football();}AbstractShirt *getShirt(){printf("Jungle get football shirt\n");return new FootballShirt();}
};

三、客户端代码

#include <iostream>
#include "AbstractFactory.h"int main()
{printf("抽象工厂模式\n");//定义工厂类对象和产品类对象AbstractFactory *fac = NULL;AbstractBall *ball = NULL;AbstractShirt *shirt = NULL;fac = new BasketballFactory();ball = fac->getBall();shirt = fac->getShirt();fac = new FootballFactory();ball = fac->getBall();shirt = fac->getShirt();system("pause");return 0;
}

【C++设计模式】抽象工厂模式相关推荐

  1. 系统架构技能之设计模式-抽象工厂模式

    一.上篇回顾 上篇我们主要讲述了简单工厂模式和工厂模式.并且分析了每种模式的应用场景和一些优缺点,我们现在来回顾一下: 简单工厂模式:一个工厂负责所有类型对象的创建,不支持无缝的新增新的类型对象的创建 ...

  2. 常见设计模式—抽象工厂模式

    设计模式-抽象工厂模式 1.什么是抽象工厂模式 抽象工厂模式是围绕一个超级工厂创建其它工厂,是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品. 2.角色分 ...

  3. 【JAVA进阶系列】JAVA 设计模式 -- 抽象工厂模式(Abstract Factory)

    [JAVA进阶系列]JAVA 设计模式 -- 抽象工厂模式(Abstract Factory) [1.1]抽象工厂模式简介 抽象工厂者模式的类结构图 AbstractProduct(抽象产品),Abs ...

  4. java设计模式---抽象工厂模式

    工厂模式在项目中是常常用到的,有人说只有大项目才会用到,小项目是体会不出来.其实使用设计模式与项目的大小没有实质性的联系.设计模式是经验的总结而不是衡量项目大小的标准. 以开发项目的DAO层为例,在项 ...

  5. C++设计模式--抽象工厂模式

    前言 前面有两篇文章分别介绍了简单工厂模式和工厂方法模式,这两种模式都比较常见,今天介绍工厂模式的最后一种,抽象工厂模式. 抽象工厂模式(Abstract Factory Pattern)是所有形态的 ...

  6. python工厂模式 理解_浅谈Python设计模式 - 抽象工厂模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在上一篇我们对工厂模式中的普通工厂模式有了一定的了解,其实抽象工作就是 表示针对 ...

  7. 05设计模式——抽象工厂模式

    前言:以下总结来自龙哥---左潇龙博客. 总结的很到位,附上博客链接:http://www.cnblogs.com/zuoxiaolong/p/pattern6.html 抽象工厂模式算是工厂相关模式 ...

  8. [设计模式] ------ 抽象工厂模式

    抽象工厂模式 抽象工厂模式,就是对工厂方法模式加以改进而已,其实就是用简单工厂模式的套路创建各个工厂,后面和工厂模式就一模一样了. 其实就是相当于将创建哪个工厂的权利再次放给调用端. 调用端在调用的时 ...

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

    目录 基本概念 代码与实例 基本概念 抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,从而无需指定他们具体的类. 抽象工厂的好处: 1. 易于交换产品系列 ...

  10. 深入理解设计模式-抽象工厂模式

    文章目录 一.定义 二.使用场景 三.代码样例 1.需求 2.类图 3.实体类 4.产品类 5.工厂类 6.客户端 四.优缺点 结尾 一.定义 抽象工厂模式隶属于设计模式中的创建型模式,用于产品族的构 ...

最新文章

  1. AnkhSVN使用手册
  2. “四方定理”--蓝桥杯
  3. Integer与int的比较与区别
  4. 246. Strobogrammatic Number
  5. 简单新闻管理系统(jsp)
  6. ArcGIS批量计算图层中矢量要素面积——ArcMap
  7. bilibili老版本_bilibili旧版本
  8. 本周大新闻|传Cambria采用升级版XR2芯片,TGS增设VR虚拟展厅
  9. 自己搭建网站选用服务器的方法
  10. Android中如何利用Minui显示PNG格式的图片
  11. 1096:数字统计(信奥)
  12. 网站让浏览器崩溃的原因有哪些
  13. 易语言c语言哪个做游戏脚本,易语言游戏脚本写法源码
  14. 移动机器人控制软件的设计与实现
  15. python二级真题 d[i] = d.get(i,0)+1
  16. omniplan导出html,OmniPlan 3.14.4 最NB的项目管理流程软件
  17. wow盗号木马事件前后
  18. 奇虎360Java笔试题
  19. oracle延时盲注如何防止,【原创】WEB安全第四章SQL注入篇21 oracle 延时注入
  20. 哈哈哈,真香!妹子图终于可以多图预览了

热门文章

  1. linux yum源配置
  2. TeamTalk服务器编译与部署
  3. mac appium环境搭建
  4. Kolmogorov复杂性简介(转)
  5. 服务器如何从bios修改mac,BIOS维修网站www.biosrepair.com-用编程器修改网卡MAC地址
  6. lisp弧度转度分秒_度分秒转弧度)
  7. 1.3分布式系统架构技术选型
  8. Android——ViewHolder
  9. 阿里云国际版云服务器Linux和Windows操作系统的链路测试工具-Unirech
  10. MQL5 编程基础: 文件