Builder.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. #ifndef BUILDER_H
  2. #define BUILDER_H
  3. /**
  4. * @file Builder.h
  5. * @author your name (you@domain.com)
  6. * @brief
  7. * @version 0.1
  8. * @date 2025-02-22
  9. *
  10. * @copyright Copyright (c) 2025
  11. *
  12. */
  13. /**
  14. * 建造者模式
  15. * 1. 建造者模式有一个抽象生成器父类,定义了产品的创建接口
  16. * 2. 有n个具体生成器类,实现了抽象生成器父类的接口,负责创建产品的各个部件
  17. * 3. 有一个指挥者类,负责调用生成器类的接口,生成产品
  18. * 4. 有一个产品类,包含了产品的各个部件
  19. *
  20. */
  21. #include <vector>
  22. #include <map>
  23. #include "spdlog/spdlog.h"
  24. /* ====================================================
  25. * 创建两个产品类,存放生成的每个部件
  26. * ==================================================== */
  27. class SunnyShip
  28. {
  29. public:
  30. SunnyShip() {}
  31. ~SunnyShip() {}
  32. /* 添加部件 */
  33. void addPart(const std::string& part)
  34. {
  35. m_parts.push_back(part);
  36. }
  37. /* 展示部件 */
  38. void ShowParts()
  39. {
  40. for (auto part : m_parts)
  41. {
  42. SPDLOG_INFO("Part: {}", part);
  43. }
  44. }
  45. private:
  46. std::vector<std::string> m_parts;
  47. };
  48. /**
  49. * @brief 美丽号零件有区别,使用map来存储
  50. *
  51. */
  52. class MerryShip
  53. {
  54. public:
  55. MerryShip() {}
  56. ~MerryShip() {}
  57. /* 添加部件,键是部件材料,值是部件名称 */
  58. void addPart(const std::string& name, const std::string& part)
  59. {
  60. m_parts.insert(std::make_pair(name, part));
  61. }
  62. /* 展示部件 */
  63. void ShowParts()
  64. {
  65. for (auto part : m_parts)
  66. {
  67. SPDLOG_INFO("{}:{}", part.first, part.second);
  68. }
  69. }
  70. private:
  71. std::map<std::string, std::string> m_parts; /* 部件材料和部件名称 */
  72. };
  73. /* ====================================================
  74. * 创建一个抽象生成器父类,定义了产品的创建接口
  75. * ==================================================== */
  76. class ShipBuilder
  77. {
  78. public:
  79. virtual ~ShipBuilder() {}
  80. virtual void reset() = 0;
  81. virtual void buildBody() = 0; /* 创建船体 */
  82. virtual void buildEngine() = 0; /* 创建引擎 */
  83. virtual void buildWeapon() = 0; /* 创建武器 */
  84. virtual void buildInterior() = 0; /* 创建内饰 */
  85. };
  86. /**
  87. * @brief Sunny号生成器
  88. *
  89. */
  90. class SunnyShipBuilder : public ShipBuilder
  91. {
  92. public:
  93. SunnyShipBuilder() { reset(); }
  94. ~SunnyShipBuilder()
  95. {
  96. if(m_ship != nullptr)
  97. {
  98. delete m_ship;
  99. }
  100. }
  101. void reset() override
  102. {
  103. m_ship = new SunnyShip();
  104. }
  105. void buildBody() override
  106. {
  107. m_ship->addPart("Sunny Body");
  108. }
  109. void buildEngine() override
  110. {
  111. m_ship->addPart("Sunny Engine");
  112. }
  113. void buildWeapon() override
  114. {
  115. m_ship->addPart("Sunny Weapon");
  116. }
  117. void buildInterior() override
  118. {
  119. m_ship->addPart("Sunny Interior");
  120. }
  121. /* 提供一个获取船的接口 */
  122. SunnyShip* getShip()
  123. {
  124. SunnyShip* ship = m_ship;
  125. m_ship = nullptr;
  126. return ship;
  127. }
  128. private:
  129. SunnyShip* m_ship = nullptr;
  130. };
  131. /**
  132. * @brief Merry号生成器
  133. *
  134. */
  135. class MerryShipBuilder : public ShipBuilder
  136. {
  137. public:
  138. MerryShipBuilder() { reset(); }
  139. ~MerryShipBuilder()
  140. {
  141. if(m_ship != nullptr)
  142. {
  143. delete m_ship;
  144. }
  145. }
  146. void reset() override
  147. {
  148. m_ship = new MerryShip();
  149. }
  150. void buildBody() override
  151. {
  152. m_ship->addPart("Wood", "Merry Body");
  153. }
  154. void buildEngine() override
  155. {
  156. m_ship->addPart("Iron", "Merry Engine");
  157. }
  158. void buildWeapon() override
  159. {
  160. m_ship->addPart("Cannon", "Merry Weapon");
  161. }
  162. void buildInterior() override
  163. {
  164. m_ship->addPart("Gold", "Merry Interior");
  165. }
  166. /* 提供一个获取船的接口 */
  167. MerryShip* getShip()
  168. {
  169. MerryShip* ship = m_ship;
  170. m_ship = nullptr;
  171. return ship;
  172. }
  173. private:
  174. MerryShip* m_ship = nullptr;
  175. };
  176. /* ====================================================
  177. * 创建一个船厂(主管),生成不同类型的船
  178. * ==================================================== */
  179. class ShipFactory
  180. {
  181. public:
  182. ShipFactory() {}
  183. ~ShipFactory() {}
  184. /* 设置Builder */
  185. void setBuilder(ShipBuilder* builder)
  186. {
  187. m_builder = builder;
  188. }
  189. /* 建造简约型的船 */
  190. void builderSimpleShip()
  191. {
  192. m_builder->buildBody();
  193. m_builder->buildEngine();
  194. }
  195. /* 建造标准型的船 */
  196. void builderStandardShip()
  197. {
  198. builderSimpleShip();
  199. m_builder->buildWeapon();
  200. }
  201. /* 建造豪华型的船 */
  202. void builderRegalShip()
  203. {
  204. builderStandardShip();
  205. m_builder->buildInterior();
  206. }
  207. public:
  208. ShipBuilder* m_builder = nullptr;
  209. };
  210. /* ====================================================
  211. * 创建船,使用全局函数来创建
  212. * ==================================================== */
  213. /* 创建Sunny号 */
  214. void buildSunnyShip();
  215. /* 创建Merry号 */
  216. void buildMerryShip();
  217. #endif // BUILDER_H