本文借鉴Java大佬的设计模式,灰常厉害的大佬

简单工厂模式--->https://blog.csdn.net/aby_byy/article/details/99328126

工厂模式--->https://blog.csdn.net/aby_byy/article/details/99329071

抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象创建型模式。在抽象工厂模式中,每一个具体工厂都提供了多个工厂方法用于产生多种不同类型的产品。

A类、B类(抽象产品)它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法

A1、A2、B1、B2类(具体产品)它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。

AbstractFactor类(抽象工厂)它声明了一组用于创建一族产品的方法createA()、createB(),每一个方法对应一种产品。

D1、D2(具体工厂)它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。

比如生产 15.6的电脑 ,那么就得是15.6的显示屏   15.6的外壳    始终是同一个产品族的对象!

抽象工厂模式实现:

#include<string>
class A
{
public:A(std::string name) :mname(name){}virtual void operation() = 0;
protected:std::string mname;
};
class A1:public A
{
public:A1(std::string name) :A(name){}virtual void operation(){std::cout << "A1" << std::endl;}
};
class A2:public A
{
public:A2(std::string name) :A(name){}virtual void operation(){std::cout << "A2" << std::endl;}
};class B
{
public:B(std::string name) :mname(name){}virtual void operation() = 0;
protected:std::string mname;
};
class B1:public B
{
public:B1(std::string name) :B(name){}virtual void operation(){std::cout << "B1" << std::endl;}
};
class B2:public B
{
public:B2(std::string name) :B(name){}virtual void operation(){std::cout << "B2" << std::endl;}
};class AbstractFactory
{
public:AbstractFactory(std::string name) :mname(name){}virtual A* createA() = 0;virtual B* createB() = 0;
protected:std::string mname;
};
class D1 :public AbstractFactory
{
public:D1(std::string name) :AbstractFactory(name){}virtual A* createA(){return new A1("a1");}virtual B* createB(){return new B1("b1");}
};
class D2 :public AbstractFactory
{
public:D2(std::string name) :AbstractFactory(name){}virtual A* createA(){return new A2("a2");}virtual B* createB(){return new B2("b2");}
};int main()
{AbstractFactory* paf = new D2("d2");A* pa = paf->createA();B* pb = paf->createB();pa->operation();pb->operation();return 0;
}

抽象工厂模式总结

抽象工厂模式的主要优点:

  • 抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易,所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。
  • 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。
  • 增加新的产品族很方便,无须修改已有系统,符合”开闭原则”。

抽象工厂模式的主要缺点:

  • 增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的不便,违背了\”开闭原则”。

适用场景:

  • 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是很重要的,用户无须关心对象的创建过程,将对象的创建和使用解耦。
  • 系统中有多于一个的产品族,而每次只使用其中某一产品族。可以通过配置文件等方式来使得用户可以动态改变产品族,也可以很方便地增加新的产品族。
  • 属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。同一个产品族中的产品可以是没有任何关系的对象,但是它们都具有一些共同的约束,如同一操作系统下的按钮和文本框,按钮与文本框之间没有直接关系,但它们都是属于某一操作系统的,此时具有一个共同的约束条件:操作系统的类型。
  • 产品等级结构稳定,设计完成之后,不会向系统中增加新的产品等级结构或者删除已有的产品等级结构。

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

  1. 抽象工厂模式 java实例 tclhaier_Unity常用的设计模式_工厂模式系列之抽象工厂模式...

    在工厂方法模式中,工厂只负责生产具体的产品,每一个具体的工厂对应着一个具体的产品,工厂方法也具有唯一性,如果有时候我们需要一个工厂方法提供多个产品而不是一个单一的产品,例如:海尔品牌不止生产海尔TV, ...

  2. 编程模式 之美 -- 抽象工厂模式

    文章目录 1. 解决问题 2. 应用场景 3. 实现如下: C++实现 C语言实现 4. 缺点 1. 解决问题 在工厂方法模式中,我们卖衣服.此时我们为每一种衣服创建不同的工厂,帽子有一个工厂专门创建 ...

  3. 工厂方法模式和抽象工厂模式

    工厂方法模式和抽象工厂模式 工厂方法模式 抽象工厂模式 总结: 工厂方法模式 #include <string> #include <iostream>// Abstract ...

  4. 抽象工厂模式AbstractFactory

    简介 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类.抽象工厂模式又称为Kit模式,属于对象创建型模式. 不同点 ...

  5. 工厂方法模式与抽象工厂模式的区别

    工厂方法模式: 一个抽象产品类,可以派生出多个具体产品类. 一个抽象工厂类,可以派生出多个具体工厂类. 每个具体工厂类只能创建一个具体产品类的实例. 抽象工厂模式: 多个抽象产品类,每个抽象产品类可以 ...

  6. 设计模式C#描述——抽象工厂模式

    设计模式C#描述--抽象工厂模式 阅读此文应先阅读简单工厂模式与工厂方法模式 抽象工厂模式是对象的创建模式,它是工厂方法模式的进一步推广. 假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产 ...

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

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

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

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

  9. 设计模式之笔记--抽象工厂模式(Abstract Factory)

    抽象工厂模式(Abstract Factory) 定义 抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 类图 描述 多个抽象产品 ...

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

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

最新文章

  1. python编写脚本,删除固定用户下的所有表
  2. MATLAB学习笔记(十六)
  3. PHP编写shell
  4. 支付宝升级商家积分等服务 商家积分权益增至60余种
  5. 寄存器间接寻址缺点_详解西门子间接寻址之地址寄存器间接寻址
  6. Dell笔记本耳机孔插进入没有反应问题
  7. 管理计算机找不到应用程序,电脑打开IE浏览器显示找不到应用程序如何解决
  8. 欧拉计划22--Names score
  9. MindManager 思维导图全面介绍
  10. 基于ImagePy工具的岩块图像二值化分割研究
  11. 【转载】 身份证号码校验(15位和18位都可以)
  12. 用Python解析XML的几种常见方法的介绍
  13. python中的散点图还可以这么画
  14. c语言解二次方程复数计算器,黑暗计算器(复数,解方程)
  15. 在VB环境中操作三维模型的实现方法
  16. 同样的程序每次运行的时间不一样
  17. 单电源运放和双电源运放的区别
  18. Aggregated APIServer 构建云原生应用最佳实践
  19. 智慧职教云答案在哪里找_职教云获取答案软件,智慧职教云答案在哪里找,职教云的答案在哪里找?...
  20. 滴滴专车司机苹果手机ios客户端可以下载了

热门文章

  1. 【运维】- raid管理工具MegaCli以及storcli使用介绍
  2. 【V001】ISE chipscope 连接不上FPGA 或找不到JTAG
  3. 启英泰伦产品方案开发流程
  4. LeetCode(Python实现)——Easy部分【Day2】
  5. android 11 移除桌面搜索栏
  6. 起泡法排序,从小到大顺序排列
  7. Null ModelAndView returned to DispatcherServlet with name ‘springmvc‘: assuming HandlerAdapter compl
  8. C语言实现乘法口诀表
  9. 自动化测试实战笔记--网易云实现QQ登录
  10. 三菱FX5U-绝对定位指令 DRVA(DDRVA) 两种写法