当前位置:   article > 正文

C++设计模式3:工厂模式

C++设计模式3:工厂模式

         工厂模式都是在那种有着大量类的程序里面使用的,比如我突然要产生许多的类,这时候就可以用工厂模式,工厂模式有如下三种类型。

简单工厂

        用户输入实例化的信息(比如产品名称),向工厂申请对象,工厂返回相应的对象,用户完全不需要知道,这个对象的具体构造方式,封装了对象的创建。

  1. #include<iostream>
  2. using namespace std;
  3. class Car
  4. {
  5. public:
  6. Car() {}
  7. ~Car() {}
  8. virtual void show() = 0;
  9. };
  10. class Audi:public Car
  11. {
  12. public:
  13. Audi() {}
  14. ~Audi() {}
  15. void show()
  16. {
  17. cout << "this is Audi" << endl;
  18. }
  19. };
  20. class Baoma :public Car
  21. {
  22. public:
  23. Baoma() {}
  24. ~Baoma() {}
  25. void show()
  26. {
  27. cout << "this is Baoma" << endl;
  28. }
  29. };
  30. enum CarType
  31. {
  32. BAOMA,AUDI
  33. };
  34. class SimpleFactory
  35. {
  36. public:
  37. SimpleFactory() {}
  38. ~SimpleFactory(){}
  39. Car* createCar(CarType type)
  40. {
  41. switch (type)
  42. {
  43. case BAOMA:
  44. return new Baoma();
  45. case AUDI:
  46. return new Audi();
  47. }
  48. }
  49. };
  50. int main()
  51. {
  52. SimpleFactory factory;
  53. unique_ptr< Car>myaudi(factory.createCar(AUDI));
  54. unique_ptr< Car>mybaoma(factory.createCar(BAOMA));
  55. myaudi->show();
  56. mybaoma->show();
  57. return 0;
  58. }

 

        简单工厂存在明显的缺点,那就是如果要产生新的产品,就需要改变源头的工厂类,因为简单工厂只有一个工厂,这不符合软件设计的开闭原则。

工厂方法

        实现能够产生不同产品的工厂,用这些工厂产生它们对应的产品,如果有新的产品,就添加工厂类就可以了,完全不用改变之前实现的工厂类。

  1. #include<iostream>
  2. using namespace std;
  3. class Car
  4. {
  5. public:
  6. Car() {}
  7. ~Car() {}
  8. virtual void show() = 0;
  9. };
  10. class Audi:public Car
  11. {
  12. public:
  13. Audi() {}
  14. ~Audi() {}
  15. void show()
  16. {
  17. cout << "this is Audi" << endl;
  18. }
  19. };
  20. class Baoma :public Car
  21. {
  22. public:
  23. Baoma() {}
  24. ~Baoma() {}
  25. void show()
  26. {
  27. cout << "this is Baoma" << endl;
  28. }
  29. };
  30. class FactoryMethod
  31. {
  32. public:
  33. virtual Car* createCar() = 0;
  34. };
  35. class AudiFactory:public FactoryMethod
  36. {
  37. public:
  38. Car* createCar()
  39. {
  40. return new Audi();
  41. }
  42. };
  43. class BaoMaFactory:public FactoryMethod
  44. {
  45. public:
  46. Car* createCar()
  47. {
  48. return new Baoma();
  49. }
  50. };
  51. int main()
  52. {
  53. unique_ptr<FactoryMethod>audifactory(new AudiFactory());
  54. unique_ptr<FactoryMethod>baomafactory(new BaoMaFactory());
  55. unique_ptr< Car>myaudi(audifactory->createCar());
  56. unique_ptr< Car>mybaoma(baomafactory->createCar());
  57. myaudi->show();
  58. mybaoma->show();
  59. return 0;
  60. }

抽象工厂

把有关联关系的,属于一个产品簇的所有产品创建的接口函数,放在一个抽象工厂里面,派生类应该负责创建该产品簇里面的所有产品,比如华为和小米都是派生类,抽象工厂要生产手机和耳机以及充电头,那么小米和华为这两个派生类工厂,就要产生这些产品。

显然,抽象工厂也有不好的地方,假如我华为要产生手机芯片这一新的产品,那么抽象工厂就要跟着改变,由于抽象工厂类是抽象的,所以所有派生类都要实现那个产生芯片的函数,不然派生类也会变成抽象类,但是小米不一定要自己生产芯片。

  1. #include<iostream>
  2. using namespace std;
  3. class Car
  4. {
  5. public:
  6. Car() {}
  7. ~Car() {}
  8. virtual void show() = 0;
  9. };
  10. class Audi:public Car
  11. {
  12. public:
  13. Audi() {}
  14. ~Audi() {}
  15. void show()
  16. {
  17. cout << "this is Audi" << endl;
  18. }
  19. };
  20. class Baoma :public Car
  21. {
  22. public:
  23. Baoma() {}
  24. ~Baoma() {}
  25. void show()
  26. {
  27. cout << "this is Baoma" << endl;
  28. }
  29. };
  30. class Light
  31. {
  32. public:
  33. Light() {}
  34. ~Light() {}
  35. virtual void show() = 0;
  36. };
  37. class AudiLight:public Light
  38. {
  39. public:
  40. AudiLight() {}
  41. ~AudiLight() {}
  42. void show()
  43. {
  44. cout << "this is AudiLight" << endl;
  45. }
  46. };
  47. class BaoMaLight :public Light
  48. {
  49. public:
  50. BaoMaLight() {}
  51. ~BaoMaLight() {}
  52. void show()
  53. {
  54. cout << "this is BaoMaLight" << endl;
  55. }
  56. };
  57. class AbstractFactory
  58. {
  59. public:
  60. virtual Car* createCar() = 0;
  61. virtual Light* createLight() = 0;
  62. };
  63. class AudiFactory:public AbstractFactory
  64. {
  65. public:
  66. Car* createCar()
  67. {
  68. return new Audi();
  69. }
  70. Light* createLight()
  71. {
  72. return new AudiLight();
  73. }
  74. };
  75. class BaoMaFactory:public AbstractFactory
  76. {
  77. public:
  78. Car* createCar()
  79. {
  80. return new Baoma();
  81. }
  82. Light* createLight()
  83. {
  84. return new BaoMaLight();
  85. }
  86. };
  87. int main()
  88. {
  89. unique_ptr<AbstractFactory>audifactory(new AudiFactory());
  90. unique_ptr<AbstractFactory>baomafactory(new BaoMaFactory());
  91. unique_ptr< Car>myaudi(audifactory->createCar());
  92. unique_ptr< Car>mybaoma(baomafactory->createCar());
  93. unique_ptr<Light>myaudilight(audifactory->createLight());
  94. unique_ptr<Light>mybaomalight(baomafactory->createLight());
  95. myaudi->show();
  96. myaudilight->show();
  97. mybaoma->show();
  98. mybaomalight->show();
  99. return 0;
  100. }

        显然,抽象工厂也有不好的地方,假如我华为要产生手机芯片这一新的产品,那么抽象工厂就要跟着改变,由于抽象工厂类是抽象的,所以所有派生类都要实现那个产生芯片的函数,不然派生类也会变成抽象类,但是小米不一定要自己生产芯片。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/1022388
推荐阅读
相关标签
  

闽ICP备14008679号