• 设计模式3、工厂方法模式 Factory Method


    解释说明:定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类
    抽象工厂(AbstractFactory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品
    具体工厂(ConcreteFactory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建
    抽象产品(Product):定义产品的规范,描述了产品的主要特性和功能
    具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是一对一的关系
    优点:
        克服了简单工厂模式违背开放-封闭原则的缺点,又保留了封装对象创建过程的优点,降低客户端和工厂的耦合性。所以说,“工厂方法模式”是“简单工厂模式”的进一步抽象和推广。
    缺点:
        每增加一个产品,相应的也要增加一个子工厂,加大了额外的开发量
    适用场景
        对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。
    只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程对于使用者来说是透明的
    考虑这样一个场景,如下图:
        Jungle想要进行户外运动,它可以选择打篮球、踢足球或者玩排球。和上一次的体育保管室不同,这次分别由篮球保管室、足球保管室和排球保管室,Jungle只需直接去相应的保管室就可以拿到对应的球!然后Jungle就可以愉快地玩耍了
    1. product.h
    2. #pragma once
    3. #include
    4. using namespace std;
    5. // 汽车接口
    6. class ICar
    7. {
    8. public:
    9. virtual string Name() = 0; // 汽车名称
    10. };
    11. concreteProduct.h
    12. #pragma once
    13. #include "product.h"
    14. // 奔驰汽车
    15. class BenzCar : public ICar
    16. {
    17. public:
    18. string Name()
    19. {
    20. return "Benz Car";
    21. }
    22. };
    23. // 宝马汽车
    24. class BmwCar : public ICar
    25. {
    26. public:
    27. string Name()
    28. {
    29. return "Bmw Car";
    30. }
    31. };
    32. // 奥迪汽车
    33. class AudiCar : public ICar
    34. {
    35. public:
    36. string Name()
    37. {
    38. return "Audi Car";
    39. }
    40. };
    41. factory.h
    42. #pragma once
    43. #include "product.h"
    44. // 工厂接口
    45. class AFactory
    46. {
    47. public:
    48. virtual ICar* CreateCar() = 0; // 生产汽车
    49. };
    50. concreteProduct.h
    51. #pragma once
    52. #include "factory.h"
    53. #include "concreteProduct.h"
    54. // 奔驰工厂
    55. class BenzFactory : public AFactory
    56. {
    57. public:
    58. ICar* CreateCar()
    59. {
    60. return new BenzCar();
    61. }
    62. };
    63. // 宝马工厂
    64. class BmwFactory : public AFactory
    65. {
    66. public:
    67. ICar* CreateCar()
    68. {
    69. return new BmwCar();
    70. }
    71. };
    72. // 奥迪工厂
    73. class AudiFactory : public AFactory
    74. {
    75. public:
    76. ICar* CreateCar()
    77. {
    78. return new AudiCar();
    79. }
    80. };
    81. main.cpp
    82. #include "concreteFactory.h"
    83. #include "product.h"
    84. #include
    85. #ifndef SAFE_DELETE
    86. #define SAFE_DELETE(p) { if(p){delete(p); (p)=NULL;} }
    87. #endif
    88. int main()
    89. {
    90. // 奔驰
    91. AFactory *pFactory = new BenzFactory();
    92. ICar *pCar = pFactory->CreateCar();
    93. cout << "Benz factory: " << pCar->Name() << endl;
    94. SAFE_DELETE(pCar);
    95. SAFE_DELETE(pFactory);
    96. // 宝马
    97. pFactory = new BmwFactory();
    98. pCar = pFactory->CreateCar();
    99. cout << "Bmw factory: " << pCar->Name() << endl;
    100. SAFE_DELETE(pCar);
    101. SAFE_DELETE(pFactory);
    102. // 奥迪
    103. pFactory = new AudiFactory();
    104. pCar = pFactory->CreateCar();
    105. cout << "Audi factory: " << pCar->Name() << endl;
    106. SAFE_DELETE(pCar);
    107. SAFE_DELETE(pFactory);
    108. system("pause");
    109. return 0;
    110. }

  • 相关阅读:
    Linux修改或添加ssh服务端口
    0601STM32TIM
    ⑥ 在vue中引入路由
    C语言中 -> 和 . 的区别
    Python代码运行速度提升技巧!Python远比你想象中的快~
    四种常见分布式限流算法实现!
    PostgreSql学习(基于菜鸟课程)
    bqplot教程:在Jupyter Notebook中进行交互式数据可视化
    Spring boot 实战指南(一):入门、配置、Web、文件上传、异常页面
    PyScada(三)后端应用
  • 原文地址:https://blog.csdn.net/u013480226/article/details/133388017