1.简单工厂模式

1.1 定义

定义一个工厂类,他可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。

1.2 优点

  1. 工厂类包含必要的逻辑判断,可以决定在什么时候创建哪一个产品的实例。客户端可以免除直接创建产品对象的职责。
  2. 客户端无需知道所创建具体产品的类名,只需知道参数即可。
  3. 也可以引入配置文件,在不修改客户端代码的情况下更换和添加新的具体产品类。

    1.3 缺点

  4. 工厂类集中了所有产品的创建逻辑,职责过重,一旦异常,整个系统将受影响。

  5. 使用简单工厂模式会增加系统中类的个数(引入新的工厂类),增加系统的复杂度和理解难度。
  6. 系统扩展困难,一旦增加新产品不得不修改工厂逻辑,在产品类型较多时,可能造成逻辑过于复杂。
  7. 简单工厂模式使用了static工厂方法,造成工厂角色无法形成基于继承的等级结构。

    1.4 使用场景

  8. 工厂类负责创建对的对象比较少,因为不会造成工厂方法中的业务逻辑过于复杂。

  9. 客户端只知道传入工厂类的参数,对如何创建对象不关心。

    1.5 类图及示例代码

    2. 工厂模式 - 图1 ```cpp // 简单工厂模式

    include

using namespace std;

// 怪物父类 class Monster { public: Monster(int life, int magic, int attack) : E_life(life) , E_magic(magic) , E_attack(attack) { } // 做父类时析构函数应该为虚函数 virtual ~Monster() = default;

private: // 怪物属性 int E_life; // 生命值 int E_magic; // 魔法 int E_attack; // 攻击力 };

// 亡灵类怪物 class Undead : public Monster { public: Undead(int life, int magic, int attack) : Monster(life, magic, attack) { cout << “A undead monster came into the world.” << endl; } // 其它逻辑代码 ~Undead() override = default; };

// 元素类怪物 class Element : public Monster { public: Element(int life, int magic, int attack) : Monster(life, magic, attack) { cout << “A element monster came into the world.” << endl; } // 其它逻辑代码 ~Element() override = default; };

// 机械类怪物 class Mechanic : public Monster { public: Mechanic(int life, int magic, int attack) : Monster(life, magic, attack) { cout << “A mechanic monster came into the world.” << endl; } // 其他逻辑代码 ~Mechanic() override = default; };

// 静态工厂 class StaticMonsterFactory { public: enum MonsterType { E_Undead, E_Element, E_Mechanic };

  1. static Monster* CreateMonster(MonsterType type)
  2. {
  3. Monster* monster = nullptr;
  4. if (type == E_Undead) { // 亡灵类
  5. monster = new Undead(300, 50, 60);
  6. } else if (type == E_Element) { // 元素类
  7. monster = new Element(200, 80, 100);
  8. } else if (type == E_Mechanic) { // 机械类
  9. monster = new Mechanic(400, 0, 110);
  10. }
  11. return monster;
  12. }

};

void simple_factory() { std::cout << “simple factory” << std::endl; { // 不创建 Monster monster1 = new Undead(300, 50, 80); Monster monster2 = new Element(200, 50, 100); Monster* monster3 = new Mechanic(400, 0, 110);

  1. delete monster1;
  2. delete monster2;
  3. delete monster3;
  4. }
  5. { // 使用工厂类
  6. Monster* monster1 = StaticMonsterFactory::CreateMonster(StaticMonsterFactory::E_Undead);
  7. Monster* monster2 = StaticMonsterFactory::CreateMonster(StaticMonsterFactory::E_Element);
  8. Monster* monster3 = StaticMonsterFactory::CreateMonster(StaticMonsterFactory::E_Mechanic);
  9. delete monster1;
  10. delete monster2;
  11. delete monster3;
  12. }

}

  1. <a name="fTji8"></a>
  2. ### 2.工厂模式
  3. <a name="rMk3a"></a>
  4. #### 2.1 定义
  5. 定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
  6. <a name="ZaWPw"></a>
  7. #### 2.2 优点
  8. 1. 一个调用者想创建一个对象,只要知道其名称就可以了。
  9. 1. 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
  10. 1. 屏蔽产品的具体实现,调用者只关心产品的接口。
  11. <a name="g7CYM"></a>
  12. #### 2.3 缺点
  13. 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
  14. <a name="fj9JR"></a>
  15. #### 2.4 使用场景
  16. 1. 日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
  17. 1. 数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
  18. 1. 设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。
  19. <a name="oW6y3"></a>
  20. #### 2.5 类图及示例代码
  21. ![](https://cdn.nlark.com/yuque/0/2021/svg/2878535/1627193991851-75051778-8cfd-43c6-b86d-812e5a3dcf0e.svg#crop=0&crop=0&crop=1&crop=1&from=url&id=X4lfu&margin=%5Bobject%20Object%5D&originHeight=611&originWidth=713&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
  22. ```cpp
  23. // 怪物父类
  24. class Monster {
  25. public:
  26. Monster(int life, int magic, int attack)
  27. : m_life(life)
  28. , m_magic(magic)
  29. , m_attack(attack)
  30. {
  31. }
  32. // 做父类时析构函数应该为虚函数
  33. virtual ~Monster() = default;
  34. protected:
  35. int m_life; // 生命值
  36. int m_magic; // 魔法值
  37. int m_attack; // 攻击力
  38. };
  39. // 亡灵类怪物
  40. class Undead : public Monster {
  41. public:
  42. Undead(int life, int magic, int attack)
  43. : Monster(life, magic, attack)
  44. {
  45. cout << "A undead monster came into the world." << endl;
  46. }
  47. // 其他代码略...
  48. ~Undead() override = default;
  49. };
  50. // 元素类怪物
  51. class Element : public Monster {
  52. public:
  53. Element(int life, int magic, int attack)
  54. : Monster(life, magic, attack)
  55. {
  56. cout << "A element monster came into the world." << endl;
  57. }
  58. // 其他代码略...
  59. ~Element() override = default;
  60. };
  61. // 机械类怪物
  62. class Mechanic : public Monster {
  63. public:
  64. Mechanic(int life, int magic, int attack)
  65. : Monster(life, magic, attack)
  66. {
  67. cout << "A mechanic monster came into the world." << endl;
  68. }
  69. // 其他代码略...
  70. ~Mechanic() override = default;
  71. };
  72. // 怪物工厂父类
  73. class MonsterFactory {
  74. public:
  75. virtual Monster* CreateMonster() = 0;
  76. virtual ~MonsterFactory() = default;
  77. };
  78. // 亡灵类工厂类
  79. class UndeadFactor : public MonsterFactory {
  80. public:
  81. Monster* CreateMonster() override
  82. {
  83. // 创建亡灵类怪物
  84. return new Undead(300, 50, 80);
  85. }
  86. };
  87. // 元素类工厂类
  88. class ElementFactor : public MonsterFactory {
  89. public:
  90. Monster* CreateMonster() override
  91. {
  92. // 创建元素类怪物
  93. return new Element(300, 50, 80);
  94. }
  95. };
  96. // 机械类工厂类
  97. class MechanicFactor : public MonsterFactory {
  98. public:
  99. Monster* CreateMonster() override
  100. {
  101. // 创建机械类怪物
  102. Monster* temp = new Mechanic(300, 50, 80);
  103. return temp;
  104. }
  105. };
  106. // 1.全局的用于创建怪物对象的函数,注意形参的类型是工厂父类类型的指针
  107. Monster* globalCreateMonster(MonsterFactory* factory)
  108. {
  109. // 该虚函数扮演了多态new的行为,factory指向的具体怪物工厂类不同,创建的怪物对象也不同
  110. return factory->CreateMonster();
  111. }
  112. // 2.封装工厂子类模板
  113. template <typename T>
  114. class ChildFactory : public MonsterFactory {
  115. public:
  116. Monster* CreateMonster() override
  117. {
  118. return new T(300, 50, 80);
  119. }
  120. };
  121. void FactoryMethod()
  122. {
  123. {
  124. // 产生亡灵类怪物
  125. MonsterFactory* undeadFactor = new UndeadFactor();
  126. Monster* undead = globalCreateMonster(undeadFactor);
  127. // 产生元素类怪物
  128. MonsterFactory* elementFactor = new ElementFactor();
  129. Monster* element = globalCreateMonster(elementFactor);
  130. // 产生机械类怪物
  131. MonsterFactory* mechanicFactor = new MechanicFactor();
  132. Monster* mechanic = globalCreateMonster(mechanicFactor);
  133. delete undeadFactor;
  134. delete undead;
  135. delete elementFactor;
  136. delete element;
  137. delete mechanicFactor;
  138. delete mechanic;
  139. }
  140. {
  141. // 封装怪物子类
  142. ChildFactory<Undead> undeadFactory;
  143. Monster* undead = undeadFactory.CreateMonster();
  144. delete undead;
  145. }
  146. }

3.抽象工厂模式

3.1 定义

  • 抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。
  • 抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。
  • 抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。
  • 根据里氏替换原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。

    3.2 优点

    当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

    3.3 缺点

    产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

    3.4 使用场景

  1. QQ 换皮肤,一整套一起换。
  2. 生成不同操作系统的程序。

    3.5 类图及示例代码

    生产怪物范例抽象工厂模式示意图
    image.png

2. 工厂模式 - 图3

  1. #include <iostream>
  2. using namespace std;
  3. // 怪物父类
  4. class Monster {
  5. public:
  6. Monster(int life, int magic, int attack)
  7. : m_life(life)
  8. , m_magic(magic)
  9. , m_attack(attack)
  10. {
  11. }
  12. // 做父类时析构函数应该为虚函数
  13. virtual ~Monster() = default;
  14. protected:
  15. int m_life; // 生命值
  16. int m_magic; // 魔法值
  17. int m_attack; // 攻击力
  18. };
  19. // 沼泽地区亡灵类怪物
  20. class SwampUndead : public Monster {
  21. public:
  22. SwampUndead(int life, int magic, int attack)
  23. : Monster(life, magic, attack)
  24. {
  25. cout << "A swamp undead monster came into the world." << endl;
  26. }
  27. // 其他代码略...
  28. ~SwampUndead() override = default;
  29. };
  30. // 沼泽地区元素类怪物
  31. class SwampElement : public Monster {
  32. public:
  33. SwampElement(int life, int magic, int attack)
  34. : Monster(life, magic, attack)
  35. {
  36. cout << "A swamp element monster came into the world." << endl;
  37. }
  38. // 其他代码略...
  39. ~SwampElement() override = default;
  40. };
  41. // 沼泽地区机械类怪物
  42. class SwampMechanic : public Monster {
  43. public:
  44. SwampMechanic(int life, int magic, int attack)
  45. : Monster(life, magic, attack)
  46. {
  47. cout << "A swamp mechanic monster came into the world." << endl;
  48. }
  49. // 其他代码略...
  50. ~SwampMechanic() override = default;
  51. };
  52. // 山脉亡灵类怪物
  53. class MountainUndead : public Monster {
  54. public:
  55. MountainUndead(int life, int magic, int attack)
  56. : Monster(life, magic, attack)
  57. {
  58. cout << "A mountain undead monster came into the world." << endl;
  59. }
  60. // 其他代码略...
  61. ~MountainUndead() override = default;
  62. };
  63. // 山脉元素类怪物
  64. class MountainElement : public Monster {
  65. public:
  66. MountainElement(int life, int magic, int attack)
  67. : Monster(life, magic, attack)
  68. {
  69. cout << "A mountain element monster came into the world." << endl;
  70. }
  71. // 其他代码略...
  72. ~MountainElement() override = default;
  73. };
  74. // 山脉机械类怪物
  75. class MountainMechanic : public Monster {
  76. public:
  77. MountainMechanic(int life, int magic, int attack)
  78. : Monster(life, magic, attack)
  79. {
  80. cout << "A mountain mechanic monster came into the world." << endl;
  81. }
  82. // 其他代码略...
  83. ~MountainMechanic() override = default;
  84. };
  85. // 城镇亡灵类怪物
  86. class TownUndead : public Monster {
  87. public:
  88. TownUndead(int life, int magic, int attack)
  89. : Monster(life, magic, attack)
  90. {
  91. cout << "A town undead monster came into the world." << endl;
  92. }
  93. // 其他代码略...
  94. ~TownUndead() override = default;
  95. };
  96. // 山脉元素类怪物
  97. class TownElement : public Monster {
  98. public:
  99. TownElement(int life, int magic, int attack)
  100. : Monster(life, magic, attack)
  101. {
  102. cout << "A town element monster came into the world." << endl;
  103. }
  104. // 其他代码略...
  105. ~TownElement() override = default;
  106. };
  107. // 山脉机械类怪物
  108. class TownMechanic : public Monster {
  109. public:
  110. TownMechanic(int life, int magic, int attack)
  111. : Monster(life, magic, attack)
  112. {
  113. cout << "A town mechanic monster came into the world." << endl;
  114. }
  115. // 其他代码略...
  116. ~TownMechanic() override = default;
  117. };
  118. // 所有工厂类的父类
  119. class MonsterFactory {
  120. public:
  121. // 创建亡灵类怪物
  122. virtual Monster* createMonsterUndead() = 0;
  123. // 创建元素类怪物
  124. virtual Monster* createMonsterElement() = 0;
  125. // 创建机械类怪物
  126. virtual Monster* createMonsterMechanic() = 0;
  127. // 做父类时析构函数应该为虚函数
  128. virtual ~MonsterFactory() = default;
  129. };
  130. // 沼泽地区工厂类
  131. class SwapFactory : public MonsterFactory {
  132. public:
  133. // 创建沼泽地区亡灵类怪物
  134. Monster* createMonsterUndead() override
  135. {
  136. return new SwampUndead(300, 50, 120);
  137. };
  138. // 创建沼泽地区元素类怪物
  139. Monster* createMonsterElement() override
  140. {
  141. return new SwampElement(200, 80, 110);
  142. };
  143. // 创建沼泽地区机械类怪物
  144. Monster* createMonsterMechanic() override
  145. {
  146. return new SwampMechanic(400, 0, 90);
  147. };
  148. ~SwapFactory() override = default;
  149. };
  150. // 山脉地区工厂类
  151. class MountainFactory : public MonsterFactory {
  152. public:
  153. // 创建山脉地区亡灵类怪物
  154. Monster* createMonsterUndead() override
  155. {
  156. return new MountainUndead(300, 50, 80);
  157. };
  158. // 创建山脉地区元素类怪物
  159. Monster* createMonsterElement() override
  160. {
  161. return new MountainElement(200, 80, 100);
  162. };
  163. // 创建山脉地区机械类怪物
  164. Monster* createMonsterMechanic() override
  165. {
  166. return new MountainMechanic(600, 0, 90);
  167. };
  168. ~MountainFactory() override = default;
  169. };
  170. // 城镇地区工厂类
  171. class TownFactory : public MonsterFactory {
  172. public:
  173. // 创建城镇地区亡灵类怪物
  174. Monster* createMonsterUndead() override
  175. {
  176. return new TownUndead(300, 50, 120);
  177. };
  178. // 创建城镇地区元素类怪物
  179. Monster* createMonsterElement() override
  180. {
  181. return new TownElement(200, 80, 110);
  182. };
  183. // 创建城镇地区机械类怪物
  184. Monster* createMonsterMechanic() override
  185. {
  186. return new TownMechanic(400, 0, 90);
  187. };
  188. ~TownFactory() override = default;
  189. };
  190. void AbstractFactory()
  191. {
  192. // 多态工厂, 山脉地区的工厂
  193. MonsterFactory* mountainFactory = new MountainFactory();
  194. // 创建山脉地区的元素类怪物、亡灵类怪物
  195. Monster* mountainElementMonster = mountainFactory->createMonsterElement();
  196. Monster* mountainUndeadMonster = mountainFactory->createMonsterUndead();
  197. // 多态工厂,沼泽地区的工厂
  198. MonsterFactory* swampFactory = new SwapFactory();
  199. // 创建山脉地区的元素类怪物、亡灵类怪物
  200. Monster* swampElementMonster = swampFactory->createMonsterElement();
  201. Monster* swampUndeadMonster = swampFactory->createMonsterUndead();
  202. delete mountainFactory;
  203. delete mountainElementMonster;
  204. delete mountainUndeadMonster;
  205. delete swampFactory;
  206. delete swampElementMonster;
  207. delete swampUndeadMonster;
  208. }