• 设计模式4、建造者模式 Builder


    解释说明:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
    UML 结构图:
    抽象建造者(Builder):这个接口规定要实现复杂对象的那些部分的创建,并不设计具体部件对象的创建
    具体建造者(ConcreteBuilder):实现 Builder 的接口,完成复杂产品的各个部件的具体创建方法。在构造过程完成后,提供产品的实例
    产品(Product):要创建的复杂对象
    指挥者(Director):调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按照某种顺序创建
    优点:
        建造者独立,易于扩展
        便于控制细节风险
    缺点:
        产品必须有共同点,范围有限制
        如果内部变化复杂,将会有很多的建造类
    适用场景
        需要生成的对象具有复杂的内部结构
        需要生成的对象内部属性本身相互依赖
    考虑这样一个场景,如下图:
        Jungle想要建造一栋简易的房子(地板、墙和天花板),两个工程师带着各自的方案找上门来,直接给Jungle看方案和效果图。犹豫再三,Jungle最终选定了一位工程师……交房之日,Jungle满意的看着建好的房子,开始思考:这房子究竟是怎么建成的呢?这地板、墙和天花板是怎么建造的呢?工程师笑着说:“It's none of your business”
    1. #pragma once
    2. #include
    3. using namespace std;
    4. // 电脑
    5. class Computer
    6. {
    7. public:
    8. void SetmCpu(string cpu) { m_strCpu = cpu; }
    9. void SetmMainboard(string mainboard) { m_strMainboard = mainboard; }
    10. void SetmRam(string ram) { m_strRam = ram; }
    11. void SetVideoCard(string videoCard) { m_strVideoCard = videoCard; }
    12. string GetCPU() { return m_strCpu; }
    13. string GetMainboard() { return m_strMainboard; }
    14. string GetRam() { return m_strRam; }
    15. string GetVideoCard() { return m_strVideoCard; }
    16. private:
    17. string m_strCpu; // CPU
    18. string m_strMainboard; // 主板
    19. string m_strRam; // 内存
    20. string m_strVideoCard; // 显卡
    21. };
    22. #include "product.h"
    23. /****建造者模式 Builder******/
    24. // 建造者接口,组装流程
    25. class IBuilder
    26. {
    27. public:
    28. virtual void BuildCpu() = 0; // 创建 CPU
    29. virtual void BuildMainboard() = 0; // 创建主板
    30. virtual void BuildRam() = 0; // 创建内存
    31. virtual void BuildVideoCard() = 0; // 创建显卡
    32. virtual Computer* GetResult() = 0; // 获取建造后的产品
    33. };
    34. // ThinkPad 系列
    35. class ThinkPadBuilder : public IBuilder
    36. {
    37. public:
    38. ThinkPadBuilder() { m_pComputer = new Computer(); }
    39. void BuildCpu() { m_pComputer->SetmCpu("i5-6200U"); }
    40. void BuildMainboard() { m_pComputer->SetmMainboard("Intel DH57DD"); }
    41. void BuildRam() { m_pComputer->SetmRam("DDR4"); }
    42. void BuildVideoCard() { m_pComputer->SetVideoCard("NVIDIA Geforce 920MX"); }
    43. Computer* GetResult() { return m_pComputer; }
    44. private:
    45. Computer* m_pComputer;
    46. };
    47. // Yoga 系列
    48. class YogaBuilder : public IBuilder
    49. {
    50. public:
    51. YogaBuilder() { m_pComputer = new Computer(); }
    52. void BuildCpu() { m_pComputer->SetmCpu("i7-7500U"); }
    53. void BuildMainboard() { m_pComputer->SetmMainboard("Intel DP55KG"); }
    54. void BuildRam() { m_pComputer->SetmRam("DDR5"); }
    55. void BuildVideoCard() { m_pComputer->SetVideoCard("NVIDIA GeForce 940MX"); }
    56. Computer* GetResult() { return m_pComputer; }
    57. private:
    58. Computer* m_pComputer;
    59. };
    60. #include "builder.h"
    61. // 构造指挥官
    62. class Direcror
    63. {
    64. public:
    65. void Create(IBuilder* builder) {
    66. builder->BuildCpu();
    67. builder->BuildMainboard();
    68. builder->BuildRam();
    69. builder->BuildVideoCard();
    70. }
    71. };
    72. #include "builder.h"
    73. #include "director.h"
    74. #include
    75. #ifndef SAFE_DELETE
    76. #define SAFE_DELETE(p) { if(p){delete(p); (p)=NULL;} }
    77. #endif
    78. int main()
    79. {
    80. Direcror* pDirecror = new Direcror();
    81. ThinkPadBuilder* pTPBuilder = new ThinkPadBuilder();
    82. YogaBuilder* pYogaBuilder = new YogaBuilder();
    83. // 组装 ThinkPad、Yoga
    84. pDirecror->Create(pTPBuilder);
    85. pDirecror->Create(pYogaBuilder);
    86. // 获取组装后的电脑
    87. Computer* pThinkPadComputer = pTPBuilder->GetResult();
    88. Computer* pYogaComputer = pYogaBuilder->GetResult();
    89. // 测试输出
    90. cout << "-----ThinkPad-----" << endl;
    91. cout << "CPU: " << pThinkPadComputer->GetCPU() << endl;
    92. cout << "Mainboard: " << pThinkPadComputer->GetMainboard() << endl;
    93. cout << "Ram: " << pThinkPadComputer->GetRam() << endl;
    94. cout << "VideoCard: " << pThinkPadComputer->GetVideoCard() << endl;
    95. cout << "-----Yoga-----" << endl;
    96. cout << "CPU: " << pYogaComputer->GetCPU() << endl;
    97. cout << "Mainboard: " << pYogaComputer->GetMainboard() << endl;
    98. cout << "Ram: " << pYogaComputer->GetRam() << endl;
    99. cout << "VideoCard: " << pYogaComputer->GetVideoCard() << endl;
    100. SAFE_DELETE(pThinkPadComputer);
    101. SAFE_DELETE(pYogaComputer);
    102. SAFE_DELETE(pTPBuilder);
    103. SAFE_DELETE(pYogaBuilder);
    104. SAFE_DELETE(pDirecror);
    105. getchar();
    106. return 0;
    107. }

  • 相关阅读:
    centos7篇---安装nvidia-docker
    Springboot项目中的异常处理与返回结果的统一
    亿万级分库分表后如何进行跨表分页查询
    前端工程化精讲第四课 接口调试:Mock 工具如何快速进行接口调试?
    MySQL索引失效场景以及解决方案
    名创拟7月13日上市:最高发行价22.1港元 单季净利下降19%
    GitLab搭建
    基于ssm的OA办公管理系统
    如何解决Nginx的“413 Request Entity Too Large”错误
    测试C#调用Windows Media Player组件
  • 原文地址:https://blog.csdn.net/u013480226/article/details/133410421