设计模式 抽象工厂模式(Abstract Factory Pattern)

待我称王封你为后i 2022-09-04 06:41 126阅读 0赞
  1. 设计模式 抽象工厂模式(Abstract Factory Pattern)

一、简述

  1. 抽象工厂模式:定义一个创建一些列相关或相互依赖的对象接口,而无需指定它们具体的类。

对比工厂方法模式:(简历举例)

工厂方法模式是 多个工厂,一个工厂创建一个单一的产品。

抽象工厂模式是 多个工厂,一个工厂创建一些相关的产品(比如生产同一个牌子的上衣和裤子、比如生产同一系列但不同款式的衣服)

例子打包:例子打包:外链:https://wwa.lanzoui.com/b0c9joh4b 密码:2vf6

二、UML类图

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25hbmZlaWJ1eWk_size_16_color_FFFFFF_t_70

三、例子

场景:有3个产品工厂,产品工厂A(生产A产品、新款A产品)、产品工厂B(生产B产品、新款B产品),产品工厂C(生产C产品、新款C产品),客户端可以根据用户需要的产品类型自行找对应的产品工厂生产出对应的产品实例。

代码:(C++)

  1. #include <iostream>
  2. using namespace std;
  3. //产品基类
  4. class Product
  5. {
  6. public:
  7. virtual void ProductInfo() = 0;
  8. };
  9. //产品A
  10. class ProductA : public Product
  11. {
  12. public:
  13. void ProductInfo()
  14. {
  15. cout << "ProductA" << endl;
  16. }
  17. };
  18. //产品B
  19. class ProductB : public Product
  20. {
  21. public:
  22. void ProductInfo()
  23. {
  24. cout << "ProductB" << endl;
  25. }
  26. };
  27. //产品C
  28. class ProductC : public Product
  29. {
  30. public:
  31. void ProductInfo()
  32. {
  33. cout << "ProductC" << endl;
  34. }
  35. };
  36. //新产品基类
  37. class NewProduct
  38. {
  39. public:
  40. virtual void ProductInfo() = 0;
  41. };
  42. //New产品A
  43. class NewProductA : public NewProduct
  44. {
  45. public:
  46. void ProductInfo()
  47. {
  48. cout << "NewProductA" << endl;
  49. }
  50. };
  51. //New产品B
  52. class NewProductB : public NewProduct
  53. {
  54. public:
  55. void ProductInfo()
  56. {
  57. cout << "NewProductB" << endl;
  58. }
  59. };
  60. //New产品C
  61. class NewProductC : public NewProduct
  62. {
  63. public:
  64. void ProductInfo()
  65. {
  66. cout << "NewProductC" << endl;
  67. }
  68. };
  69. //产品工厂基类
  70. class ProductFactory
  71. {
  72. public:
  73. virtual Product* CreateProduct() = 0;
  74. virtual NewProduct* CreateNewProduct() = 0;
  75. };
  76. //产品工厂A
  77. class ProductFactoryA : public ProductFactory
  78. {
  79. public:
  80. Product* CreateProduct()
  81. {
  82. return new ProductA();
  83. }
  84. NewProduct* CreateNewProduct()
  85. {
  86. return new NewProductA();
  87. }
  88. };
  89. //产品工厂B
  90. class ProductFactoryB : public ProductFactory
  91. {
  92. public:
  93. Product* CreateProduct()
  94. {
  95. return new ProductB();
  96. }
  97. NewProduct* CreateNewProduct()
  98. {
  99. return new NewProductB();
  100. }
  101. };
  102. //产品工厂C
  103. class ProductFactoryC : public ProductFactory
  104. {
  105. public:
  106. Product* CreateProduct()
  107. {
  108. return new ProductC();
  109. }
  110. NewProduct* CreateNewProduct()
  111. {
  112. return new NewProductC();
  113. }
  114. };
  115. int main(int argc, char *argv[])
  116. {
  117. ProductFactory* productFactory = NULL;
  118. Product* product = NULL;
  119. NewProduct* newproduct = NULL;
  120. //想要产品A
  121. productFactory = new ProductFactoryA();//想要什么类型的产品就修改这里,改为对应的产品工厂
  122. product = productFactory->CreateProduct();
  123. product->ProductInfo();
  124. //新产品A
  125. newproduct = productFactory->CreateNewProduct();
  126. newproduct->ProductInfo();
  127. //想要产品B
  128. productFactory = new ProductFactoryB();
  129. product = productFactory->CreateProduct();
  130. product->ProductInfo();
  131. //新产品B
  132. newproduct = productFactory->CreateNewProduct();
  133. newproduct->ProductInfo();
  134. //想要产品C
  135. productFactory = new ProductFactoryC();
  136. product = productFactory->CreateProduct();
  137. product->ProductInfo();
  138. //新产品C
  139. newproduct = productFactory->CreateNewProduct();
  140. newproduct->ProductInfo();
  141. cin.get();
  142. return 0;
  143. }

效果:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25hbmZlaWJ1eWk_size_16_color_FFFFFF_t_70 1

四、总结

4.1 使用场景:有多个产品,但客户端一般只使用一个产品。

发表评论

表情:
评论列表 (有 0 条评论,126人围观)

还没有评论,来说两句吧...

相关阅读