• 【C++设计模式】(五)创建型模式 — 建造者模式


    目录

    1、建造者模式概念

    2、角色和职责

    3、实践演练


    1、建造者模式概念

    Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。

    对象的创建:Builder模式是为对象的创建而设计的模式—创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象- 关注对象创建的各部分的创建过程:不同的工厂(这里指builder生成器)对产品属性有不同的创建方法。

    2、角色和职责

    •  Builder:为创建产品各个部分,统一抽象接口。
    •  ConcreteBuilder:具体的创建产品的各个部分,部分A, 部分B,部分C。
    •  Director:构造一个使用Builder接口的对象。
    •  Product:表示被构造的复杂对象。

    ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

    Builder模式:

    1、引擎工厂生产引擎产品,得到汽车部件A。
    2、轮胎工厂生产轮子产品,得到汽车部件B。
    3、底盘工厂生产车身产品,得到汽车部件C。
    4、将这些部件放到一起,形成刚好能够组装成一辆汽车的整体。
    5、将这个整体送到汽车组装工厂,得到一个汽车产品。

    Builder模式所解决的问题是工厂控制产品生成器组装各个部件的过程,然后从产品生成器中得到产品。

    3、实践演练

    1. #include <iostream>
    2. #include <string>
    3. using namespace std;
    4. //汽车
    5. class Car {
    6. public:
    7. void setWheel(string wheel)
    8. {
    9. this->m_wheel = wheel;
    10. }
    11. void setWindow(string window)
    12. {
    13. this->m_window = window;
    14. }
    15. void setFrame(string frame)
    16. {
    17. this->m_frame = frame;
    18. }
    19. string getWheel()
    20. {
    21. return m_wheel;
    22. }
    23. string getWindow()
    24. {
    25. return m_window;
    26. }
    27. string getFrame()
    28. {
    29. return m_frame;
    30. }
    31. private:
    32. string m_wheel;
    33. string m_window;
    34. string m_frame;
    35. };
    36. //建造者
    37. class Builder {
    38. public:
    39. virtual void makeWheel() = 0;
    40. virtual void makeWindow() = 0;
    41. virtual void makeFrame() = 0;
    42. virtual Car *getCar() = 0;
    43. };
    44. //汽车A
    45. class Car_A : public Builder {
    46. public:
    47. Car_A()
    48. {
    49. pCar = new Car;
    50. }
    51. virtual void makeWheel()
    52. {
    53. pCar->setWheel("wheel");
    54. }
    55. virtual void makeWindow()
    56. {
    57. pCar->setWindow("window");
    58. }
    59. virtual void makeFrame()
    60. {
    61. pCar->setFrame("frame");
    62. }
    63. virtual Car *getCar()
    64. {
    65. return pCar;
    66. }
    67. private:
    68. Car *pCar;
    69. };
    70. //汽车设计师
    71. class Director {
    72. public:
    73. void Construct(Builder *car)
    74. {
    75. car->makeWheel();
    76. car->makeWindow();
    77. car->makeFrame();
    78. }
    79. };
    80. int main() {
    81. //车主直接制造汽车
    82. Car *m_car = new Car;
    83. m_car->setWheel("mcar:wheel");
    84. m_car->setWindow("mcar:window");
    85. m_car->setFrame("mcar:frame");
    86. delete m_car;
    87. //制造者直接造汽车
    88. Builder *builder = new Car_A;
    89. builder->makeWheel();
    90. builder->makeWindow();
    91. builder->makeFrame();
    92. delete builder;
    93. //设计者指挥制造者和制造汽车
    94. Director *director = new Director;
    95. Builder *builder1 = new Car_A;
    96. director->Construct(builder1);
    97. Car *car = builder1->getCar();
    98. cout << car->getWheel() <<endl;
    99. delete car;
    100. delete builder1;
    101. delete director;
    102. return 0;
    103. }

  • 相关阅读:
    查看进程与对应的线程
    数据加载及预处理
    存内计算与扩散模型:下一代视觉AIGC能力提升的关键
    智能洗地机哪个牌子好用?智能洗地机品牌排行榜
    AWS DAS认证考点整理(Kinesis篇)
    JetpackCompose从入门到实战学习笔记3——Text的简单使用
    分水果(冬季每日一题 21)
    ROS 2知识:通信协议 DDS/RTPS
    Linux Harbor 镜像存储路径和迁移方式
    SpringCloud微服务(十一)——Sentinel服务熔断限流
  • 原文地址:https://blog.csdn.net/fanjufei123456/article/details/125309135