工厂模式:包括简单工厂模式、抽象工厂模式、工厂方法模式

简单工厂模式:主要用于创建对象。用一个工厂来根据输入的条件产生不同的类,然后根据不同类的虚函数得到不同的结果。
工厂方法模式:修正了简单工厂模式中不遵守开放封闭原则。把选择判断移到了客户端去实现,如果想添加新功能就不用修改原来的类,直接修改客户端即可。
抽象工厂模式:定义了一个创建一系列相关或相互依赖的接口,而无需指定他们的具体类。

简单工厂模式

主要用于创建对象。用一个工厂来根据输入的条件产生不同的类,然后根据不同类的虚函数得到不同的结果。

应用场景:

适用于针对不同情况创建不同类时,只需传入工厂类的参数即可,无需了解具体实现方法。例如:计算器中对于同样的输入,执行不同的操作:加、减、乘、除。

实现方式

  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. // Here is the product class
  5. class Operation
  6. {
  7. public:
  8. int var1, var2;
  9. virtual double GetResult()
  10. {
  11. double res = 0;
  12. return res;
  13. }
  14. };
  15. class Add_Operation : public Operation
  16. {
  17. public:
  18. virtual double GetResult()
  19. {
  20. return var1 + var2;
  21. }
  22. };
  23. class Sub_Operation : public Operation
  24. {
  25. public:
  26. virtual double GetResult()
  27. {
  28. return var1 - var2;
  29. }
  30. };
  31. class Mul_Operation : public Operation
  32. {
  33. public:
  34. virtual double GetResult()
  35. {
  36. return var1 * var2;
  37. }
  38. };
  39. class Div_Operation : public Operation
  40. {
  41. public:
  42. virtual double GetResult()
  43. {
  44. return var1 / var2;
  45. }
  46. };
  47. // Here is the Factory class
  48. class Factory
  49. {
  50. public:
  51. static Operation *CreateProduct(char op)
  52. {
  53. switch (op)
  54. {
  55. case '+':
  56. return new Add_Operation();
  57. case '-':
  58. return new Sub_Operation();
  59. case '*':
  60. return new Mul_Operation();
  61. case '/':
  62. return new Div_Operation();
  63. default:
  64. return new Add_Operation();
  65. }
  66. }
  67. };
  68. int main()
  69. {
  70. int a, b;
  71. cin >> a >> b;
  72. Operation *p = Factory::CreateProduct('+');
  73. p->var1 = a;
  74. p->var2 = b;
  75. cout << p->GetResult() << endl;
  76. p = Factory::CreateProduct('*');
  77. p->var1 = a;
  78. p->var2 = b;
  79. cout << p->GetResult() << endl;
  80. return 0;
  81. }

工厂方法模式

修正了简单工厂模式中不遵守开放封闭原则。把选择判断移到了客户端去实现,如果想添加新功能就不用修改原来的类,直接修改客户端即可。

应用场景:

一个类不知道它所需要的对象的类:在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体的产品对象由具体工厂类创建;客户端需要知道创建具体产品的工厂类。
一个类通过其派生类来指定创建哪个对象:在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其派生类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则,在程序运行时,派生类对象将覆盖父类对象,从而使得系统更容易扩展。
将创建对象的任务委托给多个工厂派生类中的某一个,客户端在使用时可以无须关心是哪一个工厂派生类创建产品派生类,需要时再动态指定,可将具体工厂类的类名存储在配置文件或数据库中。

  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. // Here is the product class
  5. class Operation
  6. {
  7. public:
  8. int var1, var2;
  9. virtual double GetResult()
  10. {
  11. double res = 0;
  12. return res;
  13. }
  14. };
  15. class Add_Operation : public Operation
  16. {
  17. public:
  18. virtual double GetResult()
  19. {
  20. return var1 + var2;
  21. }
  22. };
  23. class Sub_Operation : public Operation
  24. {
  25. public:
  26. virtual double GetResult()
  27. {
  28. return var1 - var2;
  29. }
  30. };
  31. class Mul_Operation : public Operation
  32. {
  33. public:
  34. virtual double GetResult()
  35. {
  36. return var1 * var2;
  37. }
  38. };
  39. class Div_Operation : public Operation
  40. {
  41. public:
  42. virtual double GetResult()
  43. {
  44. return var1 / var2;
  45. }
  46. };
  47. class Factory
  48. {
  49. public:
  50. virtual Operation *CreateProduct() = 0;
  51. };
  52. class Add_Factory : public Factory
  53. {
  54. public:
  55. Operation *CreateProduct()
  56. {
  57. return new Add_Operation();
  58. }
  59. };
  60. class Sub_Factory : public Factory
  61. {
  62. public:
  63. Operation *CreateProduct()
  64. {
  65. return new Sub_Operation();
  66. }
  67. };
  68. class Mul_Factory : public Factory
  69. {
  70. public:
  71. Operation *CreateProduct()
  72. {
  73. return new Mul_Operation();
  74. }
  75. };
  76. class Div_Factory : public Factory
  77. {
  78. public:
  79. Operation *CreateProduct()
  80. {
  81. return new Div_Operation();
  82. }
  83. };
  84. int main()
  85. {
  86. int a, b;
  87. cin >> a >> b;
  88. Add_Factory *p_fac = new Add_Factory();
  89. Operation *p_pro = p_fac->CreateProduct();
  90. p_pro->var1 = a;
  91. p_pro->var2 = b;
  92. cout << p_pro->GetResult() << endl;
  93. Mul_Factory *p_fac1 = new Mul_Factory();
  94. Operation *p_pro1 = p_fac1->CreateProduct();
  95. p_pro1->var1 = a;
  96. p_pro1->var2 = b;
  97. cout << p_pro1->GetResult() << endl;
  98. return 0;
  99. }

抽象工厂模式

定义了一个创建一系列相关或相互依赖的接口,而无需指定他们的具体类。

应用场景:

一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的。
系统中有多于一个的产品族,而每次只使用其中某一产品族。
属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。
产品等级结构稳定,设计完成之后,不会向系统中增加新的产品等级结构或者删除已有的
产品等级结构。
////

  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. // Here is the product class
  5. class Operation_Pos
  6. {
  7. public:
  8. int var1, var2;
  9. virtual double GetResult()
  10. {
  11. double res = 0;
  12. return res;
  13. }
  14. };
  15. class Add_Operation_Pos : public Operation_Pos
  16. {
  17. public:
  18. virtual double GetResult()
  19. {
  20. return var1 + var2;
  21. }
  22. };
  23. class Sub_Operation_Pos : public Operation_Pos
  24. {
  25. public:
  26. virtual double GetResult()
  27. {
  28. return var1 - var2;
  29. }
  30. };
  31. class Mul_Operation_Pos : public Operation_Pos
  32. {
  33. public:
  34. virtual double GetResult()
  35. {
  36. return var1 * var2;
  37. }
  38. };
  39. class Div_Operation_Pos : public Operation_Pos
  40. {
  41. public:
  42. virtual double GetResult()
  43. {
  44. return var1 / var2;
  45. }
  46. };
  47. /*********************************************************************************/
  48. class Operation_Neg
  49. {
  50. public:
  51. int var1, var2;
  52. virtual double GetResult()
  53. {
  54. double res = 0;
  55. return res;
  56. }
  57. };
  58. class Add_Operation_Neg : public Operation_Neg
  59. {
  60. public:
  61. virtual double GetResult()
  62. {
  63. return -(var1 + var2);
  64. }
  65. };
  66. class Sub_Operation_Neg : public Operation_Neg
  67. {
  68. public:
  69. virtual double GetResult()
  70. {
  71. return -(var1 - var2);
  72. }
  73. };
  74. class Mul_Operation_Neg : public Operation_Neg
  75. {
  76. public:
  77. virtual double GetResult()
  78. {
  79. return -(var1 * var2);
  80. }
  81. };
  82. class Div_Operation_Neg : public Operation_Neg
  83. {
  84. public:
  85. virtual double GetResult()
  86. {
  87. return -(var1 / var2);
  88. }
  89. };
  90. /*****************************************************************************************************/
  91. // Here is the Factory class
  92. class Factory
  93. {
  94. public:
  95. virtual Operation_Pos *CreateProduct_Pos() = 0;
  96. virtual Operation_Neg *CreateProduct_Neg() = 0;
  97. };
  98. class Add_Factory : public Factory
  99. {
  100. public:
  101. Operation_Pos *CreateProduct_Pos()
  102. {
  103. return new Add_Operation_Pos();
  104. }
  105. Operation_Neg *CreateProduct_Neg()
  106. {
  107. return new Add_Operation_Neg();
  108. }
  109. };
  110. class Sub_Factory : public Factory
  111. {
  112. public:
  113. Operation_Pos *CreateProduct_Pos()
  114. {
  115. return new Sub_Operation_Pos();
  116. }
  117. Operation_Neg *CreateProduct_Neg()
  118. {
  119. return new Sub_Operation_Neg();
  120. }
  121. };
  122. class Mul_Factory : public Factory
  123. {
  124. public:
  125. Operation_Pos *CreateProduct_Pos()
  126. {
  127. return new Mul_Operation_Pos();
  128. }
  129. Operation_Neg *CreateProduct_Neg()
  130. {
  131. return new Mul_Operation_Neg();
  132. }
  133. };
  134. class Div_Factory : public Factory
  135. {
  136. public:
  137. Operation_Pos *CreateProduct_Pos()
  138. {
  139. return new Div_Operation_Pos();
  140. }
  141. Operation_Neg *CreateProduct_Neg()
  142. {
  143. return new Div_Operation_Neg();
  144. }
  145. };
  146. int main()
  147. {
  148. int a, b;
  149. cin >> a >> b;
  150. Add_Factory *p_fac = new Add_Factory();
  151. Operation_Pos *p_pro = p_fac->CreateProduct_Pos();
  152. p_pro->var1 = a;
  153. p_pro->var2 = b;
  154. cout << p_pro->GetResult() << endl;
  155. Add_Factory *p_fac1 = new Add_Factory();
  156. Operation_Neg *p_pro1 = p_fac1->CreateProduct_Neg();
  157. p_pro1->var1 = a;
  158. p_pro1->var2 = b;
  159. cout << p_pro1->GetResult() << endl;
  160. return 0;
  161. }