经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
【C++设计模式二】C++工厂模式
来源:cnblogs  作者:李春港  时间:2020/11/9 16:08:13  对本文有异议

(1)定义

简单工厂模式中,每新增一个具体产品,就需要修改工厂类内部的判断逻辑。为了不修改工厂类,遵循开闭原则,工厂方法模式中不再使用工厂类统一创建所有的具体产品,而是针对不同的产品设计了不同的工厂,每一个工厂只生产特定的产品。
定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。

(2)结构

工厂模式结构如下:

  • 抽象工厂(AbstractFactory):所有生产具体产品的工厂类的基类,提供工厂类的公共方法;
  • 具体工厂(ConcreteFactory):生产具体的产品;
  • 抽象产品(AbstractProduct):所有产品的基类,提供产品类的公共方法;
  • 具体产品(ConcreteProduct):具体的产品类。

(3)实例

Factory.h

  1. #ifndef FACTORY_H
  2. #define FACTORY_H
  3. #include <iostream>
  4. #include <string>
  5. /********************************产品类***********************************/
  6. //抽象产品类AbstractProduct(并非真正意义上的抽象类,含有纯虚函数才是抽象类)
  7. class AbstractSportProduct
  8. {
  9. public:
  10. AbstractSportProduct(){}
  11. ~AbstractSportProduct(){}
  12. //虚函数
  13. virtual void play(){}
  14. };
  15. //具体产品类Basketball
  16. class Basketball :public AbstractSportProduct
  17. {
  18. public:
  19. Basketball(){}
  20. ~Basketball(){}
  21. //具体实现方法
  22. void play();
  23. };
  24. //具体产品类Football
  25. class Football :public AbstractSportProduct
  26. {
  27. public:
  28. Football(){}
  29. ~Football(){}
  30. //具体实现方法
  31. void play();
  32. };
  33. /********************************工厂类***********************************/
  34. //抽象工厂类
  35. class AbstractFactory{
  36. public:
  37. //纯虚函数
  38. virtual AbstractSportProduct *getSportProduct() = 0;
  39. };
  40. //具体工厂类BasketballFactory
  41. class BasketballFactory:public AbstractFactory
  42. {
  43. public:
  44. BasketballFactory(){}
  45. ~BasketballFactory(){}
  46. AbstractSportProduct *getSportProduct();
  47. };
  48. //具体工厂类FootballFactory
  49. class FootballFactory:public AbstractFactory
  50. {
  51. public:
  52. FootballFactory(){}
  53. ~FootballFactory(){}
  54. AbstractSportProduct *getSportProduct();
  55. };
  56. #endif // FACTORY_H

Factory.cpp

  1. #include "Factory.h"
  2. /********************************产品类方法***********************************/
  3. //Basketball方法
  4. void Basketball::play(){
  5. printf("play Basketball\n");
  6. }
  7. //Football方法
  8. void Football::play(){
  9. printf("play Football\n");
  10. }
  11. /********************************工厂类方法***********************************/
  12. //BasketballFactory方法
  13. AbstractSportProduct *BasketballFactory::getSportProduct()
  14. {
  15. return new Basketball();
  16. }
  17. //FootballFactory方法
  18. AbstractSportProduct *FootballFactory::getSportProduct()
  19. {
  20. return new Football();
  21. }

main.cpp

  1. #include "Factory.h"
  2. int _tmain(int argc, _TCHAR* argv[])
  3. {
  4. AbstractSportProduct *pro = nullptr;
  5. AbstractFactory *fac = nullptr;
  6. fac = new BasketballFactory();
  7. pro = fac->getSportProduct();
  8. pro->play();
  9. fac = new FootballFactory();
  10. pro = fac->getSportProduct();
  11. pro->play();
  12. return 0;
  13. }

输出结果:

(4)总结

如果想增加棒球(Baseball)类,只需要增加一个棒球工厂(BaseballFacory),然后在客户端代码中修改具体工厂类的类名,而原有的类的代码无需修改。由此可看到,相较简单工厂模式,工厂方法模式更加符合开闭原则。工厂方法是使用频率最高的设计模式之一,是很多开源框架和API类库的核心模式。

优点:

  • 工厂方法用于创建客户所需产品,同时向客户隐藏某个具体产品类将被实例化的细节,用户只需关心所需产品对应的工厂;
  • 工厂自主决定创建何种产品,并且创建过程封装在具体工厂对象内部,多态性设计是工厂方法模式的关键;
  • 新加入产品时,无需修改原有代码,增强了系统的可扩展性,符合开闭原则。

缺点:

  • 添加新产品时,需要同时添加新的产品工厂,系统中类的数量成对增加,增加了系统的复杂度,更多的类需要编译和运行,增加了系统的额外开销;
  • 工厂和产品都引入了抽象层,客户端代码中均使用的抽象层,增加了系统的抽象层次和理解难度。

(z)源码路径

gitee: https://gitee.com/CogenCG/DesignMode

原文链接:http://www.cnblogs.com/lcgbk/p/13819350.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号