为了更清晰地理解工厂方法模式,需要先引入两个概念:

  • 产品等级结构 :产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。
  • 产品族 :在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中。

抽象工厂模式包含如下角色:

  • AbstractFactory:抽象工厂
  • ConcreteFactory:具体工厂
  • AbstractProduct:抽象产品
  • Product:具体产品

在上例中,产品族包括两个:1和2,也就是Sqlserver数据库和Access数据库。

每个产品族里面又包含两类产品:A和B,也就是User表和Department表。

而每个产品族中的产品要一起使用,就是说产品族1中的两类产品A和B要一起使用,也就是说在SqlServer数据库中SqlServerUser表和SqlServerDepartment表要一起使用,Access数据库同理。

工厂角度:

SqlFactory:

  User:

    //具体产品A1 SqlProductA

  Department:

    //具体产品B1 SqlProductB
 AccessFactory:

  User:    

    //具体产品A2 AccessProductA

  Department:

    //具体产品B2 AccessProductB

产品角度:

AbstractProductA(user 表):

  //具体产品A1 SqlProductA

  //具体产品A2 AccessProductA

AbstractProductB(Department表)

  

    //具体产品B1 SqlProductA

  //具体产品B2 AccessProductA

  1. #include<string>
  2. #include<iostream>
  3.  
  4. //数据库表项:User 与工厂模式无关
  5. class User
  6. {
  7. private:
  8. int id;
  9. std::string name;
  10. public:
  11. int getID()
  12. {
  13. return id;
  14. }
  15. std::string getName()
  16. {
  17. return name;
  18. }
  19. void setID(int ID)
  20. {
  21. this->id = ID;
  22. }
  23. void setName(std::string NAME)
  24. {
  25. this->name = NAME;
  26. }
  27. };
  28.  
  29. //数据库表项:Department 与工厂模式无关
  30. class Department
  31. {
  32. private:
  33. int id;
  34. std::string name;
  35. public:
  36. int getID()
  37. {
  38. return id;
  39. }
  40. std::string getName()
  41. {
  42. return name;
  43. }
  44. void setID(int ID)
  45. {
  46. this->id = ID;
  47. }
  48. void setName(std::string NAME)
  49. {
  50. this->name = NAME;
  51. }
  52. };
  53.  
  54. //抽象产品A:IUser
  55. class AbstractProductA{
  56. public:
  57. virtual void Insert(User user) = ;
  58. virtual User* GetUser(int id) = ;
  59. };
  60.  
  61. //具体产品A1 SqlProductA
  62. class SqlProductA :public AbstractProductA{
  63. public:
  64. void Insert(User user){
  65. std::cout << "在SQL Server中给User表增加了一条记录" << std::endl;
  66. }
  67. User* GetUser(int id){
  68. std::cout << "在SQL Server中得到id为:"<<id<<" User表一条记录" << std::endl;
  69. return NULL;
  70. }
  71. };
  72. //具体产品A2 AccessProductA
  73. class AccessProductA :public AbstractProductA{
  74. public:
  75. void Insert(User user){
  76. std::cout << "在Access中给User表增加了一条记录" << std::endl;
  77. }
  78. User* GetUser(int id){
  79. std::cout << "在Access中得到id为:" << id << " User表一条记录" << std::endl;
  80. return NULL;
  81. }
  82. };
  83.  
  84. //抽象产品B:IDepartment
  85. class AbstractProductB{
  86. public:
  87. virtual void Insert(Department department) = ;
  88. virtual Department* GetDepartment(int id) = ;
  89. };
  90.  
  91. //具体产品B1 SqlProductB
  92. class SqlProductB :public AbstractProductB{
  93. public:
  94. void Insert(Department department){
  95. std::cout << "在SQL Server中给department表增加了一条记录" << std::endl;
  96. }
  97. Department* GetDepartment(int id){
  98. std::cout << "在SQL Server中得到id为:" << id << " Department表一条记录" << std::endl;
  99. return NULL;
  100. }
  101. };
  102.  
  103. //具体产品B2 AccessProductB
  104. class AccessProductB :public AbstractProductB{
  105. public:
  106. void Insert(Department department){
  107. std::cout << "在Access中给department表增加了一条记录" << std::endl;
  108. }
  109. Department* GetDepartment(int id){
  110. std::cout << "在Access中得到id为:" << id << " Department表一条记录" << std::endl;
  111. return NULL;
  112. }
  113. };
  114.  
  115. class AbstractFactory{
  116. public:
  117. virtual AbstractProductA* createProductA() = ;
  118. virtual AbstractProductB* createProductB() = ;
  119. };
  120.  
  121. //具体工厂1:SqlServerFactory
  122. class SqlFactory :public AbstractFactory
  123. {
  124. public:
  125. AbstractProductA* createProductA()
  126. {
  127. return new SqlProductA;
  128. }
  129. AbstractProductB* createProductB()
  130. {
  131. return new SqlProductB;
  132. }
  133. };
  134.  
  135. //具体工厂2:AccessFactory
  136. class AccessFactory :public AbstractFactory{
  137. public:
  138. AbstractProductA* createProductA()
  139. {
  140. return new AccessProductA;
  141. }
  142. AbstractProductB* createProductB()
  143. {
  144. return new AccessProductB;
  145.  
  146. }
  147. };
  148.  
  149. void main()
  150. {
  151. //初始化数据库
  152. User user;
  153. Department department;
  154.  
  155. //ConcreteFactory1
  156. AbstractFactory* factory = NULL;
  157. //factory = new SqlFactory;
  158. factory = new AccessFactory;
  159. //ProductA1
  160. AbstractProductA* iu = NULL;
  161. iu = factory->createProductA();
  162. iu->Insert(user);
  163. iu->GetUser();
  164.  
  165. //ProductB1
  166. AbstractProductB* id = NULL;
  167. id = factory->createProductB();
  168. id->Insert(department);
  169. id->GetDepartment();
  170.  
  171. if (factory != NULL)
  172. {
  173. delete factory;
  174. factory = NULL;
  175. }
  176. if (iu != NULL)
  177. {
  178. delete iu;
  179. iu = NULL;
  180. }
  181. if (id != NULL)
  182. {
  183. delete id;
  184. id = NULL;
  185. }
  186.  
  187. system("pause");
  188.  
  189. }

https://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/abstract_factory.html

https://blog.csdn.net/xiqingnian/article/details/41181995

《大话设计模式》c++实现 抽象工厂模式的更多相关文章

  1. 大话设计模式C++版——抽象工厂模式

    前面说过,简单工厂模式是最基础的一种设计模式,那以工厂命名的设计模式就是23种设计模式中最多的一种,他们一脉相承,一步一步进化而来,这里就是其中的最后一种——抽象工厂模式(Abstract Facto ...

  2. 大话设计模式Python实现- 抽象工厂模式

    抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的类 下面是一个抽象工厂的demo: #!/usr/bin/env pyth ...

  3. JAVA常用设计模式(一、抽象工厂模式)

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

  4. 设计模式学习心得<抽象工厂模式 Abstract Factory>

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

  5. C#设计模式系列:抽象工厂模式(AbstractFactory)

    出自:http://www.cnblogs.com/libingql/archive/2012/12/09/2809754.html 1. 抽象工厂模式简介 1.1 定义 抽象工厂(Abstract ...

  6. [Python编程实战] 第一章 python的创建型设计模式1.1抽象工厂模式

    注:关乎对象的创建方式的设计模式就是“创建型设计模式”(creational design pattern) 1.1 抽象工厂模式 “抽象工厂模式”(Abstract Factory Pattern) ...

  7. IOS设计模式浅析之抽象工厂模式(Abstract Factory)

    概述 在前面两章中,分别介绍了简单工厂模式和工厂方法模式,我们知道简单工厂模式的优点是去除了客户端与具体产品的依赖,缺点是违反了“开放-关闭原则”:工厂方法模式克服了简单工厂模式的缺点,将产品的创建工 ...

  8. 【java设计模式】-03抽象工厂模式

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

  9. 一天一个设计模式——Abstract Factory抽象工厂模式

    一.模式说明 前面学习了工厂方法(Factory Method)模式.在工厂方法模式中,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类,具体的处理交由子类来处理.这里学习的抽象工厂 ...

  10. 重学 Java 设计模式:实战抽象工厂模式

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!

随机推荐

  1. 解决pathForResource返回nil, 无法读取plist文件问题

    有很多人在设置plist文件的时候, 会发现读取不了plist文件里面的内容, 返回值为nil, 下面我们来解决一下这个问题. 首先我们打开工程并且按照下面的步骤来设置: 设置好后, 我们来写一段代码 ...

  2. SR锁存器

    CRM(临界连续模式)BOOST PFC 电路控制系统 SR锁存器 S和R都等于0的时候为什么有两个不同的Q?正因为这样才叫锁存器.Q’是Q的取反,不可能相同.Q*和Q‘不一样.Q是Q*的前一个状态. ...

  3. multiDex分包时指定主dex的class列表

    在gradle中我们使用了如下代码可以将指定类型分配到主dex中: afterEvaluate { tasks.matching { it.name.startsWith('dex') }.each ...

  4. 如何在安装node\npm\cnpm

    1.安装node.js node.js的官方地址为:https://nodejs.org/en/download/. 根据windows版本后,选择要下载的安装包,下载完毕,按照windows一般应用 ...

  5. 洛谷P4247 序列操作 [清华集训] 线段树

    正解:线段树 解题报告: 传送门! 通过这题我get了一个神奇的,叫,线段树五问的东西hhhh 听起来有点中二但感觉真正做题的时候还是比较有用的,,,?感觉会让条理清晰很多呢,所以放一下QwQ →每个 ...

  6. 【Python全栈-JavaScript】JavaScript入门

    JavaScript基础知识点 一.JavaScript概述 参考:http://www.w3school.com.cn/b.asp JavaScript的历史 1.1992年Nombas开发出C-m ...

  7. IGMP协议

    IGMP报文格式: 4bit的IGMP版本(1)+4bit的IGMP类型(1-2)+8bit未用+16bit检验和(同ICMP)+32bit组地址(D类IP地址) 类型为1说明是由多播路由器发出的查询 ...

  8. python-面向对象-05_面向对象封装案例 II

    面向对象封装案例 II 目标 士兵突击案例 身份运算符 封装 封装 是面向对象编程的一大特点 面向对象编程的 第一步 —— 将 属性 和 方法 封装 到一个抽象的 类 中 外界 使用 类 创建 对象, ...

  9. wget 下载命令

    //下载单个文件 wget http://116.199.2.206:81/2Q2WADC9FB8D469200FF61C643601888142263926D08_unknown_65A3E1A23 ...

  10. Hibernate三种状态,缓存,以及update更新问题

    一. Hibernate中对象的三种状态 1. 瞬时状态(transient) 当我们通过Java的new关键字来生成一个实体对象时,这时这个实体对象就处于自由状态,此时该对象只是通过JVM获得了一块 ...