3 生成器(Builder)模式

十念  论坛元老 | 2025-1-14 05:34:45 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1023|帖子 1023|积分 3069

生成器模式

1.1 分类

(对象)创建型
1.2 提出题目


  • 构造一个房屋,需要思量是否有车库,游泳池,花园,雕塑等,需要对诸多成员变量举行初始化工作。都写在构造函数里?每种大概都创建一个新的类?
  • 相同的步骤需要能够产生差别的产物,例如使用木头和玻璃盖出来的是普通住房。用黄金和水晶制作出来的是宫殿。
1.3 办理方案

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建差别的表示。即将对象构造代码从产物类中抽取出来,并将其放在一个名为Builder的独立对象中。
1.4 实现类图



  • 生成器(Builder):声明通用的产物构造步骤。
  • 详细生成器(Concrete Builders):提供构造过程的差别实现。 详细生成器也可以构造不遵循通用接口的产物。
  • 产物(Products):最终生成的对象。由差别生成器构造的产物无需属于同一类层次结构或接口。
  • 主管(Director):定义调用构造步骤的顺序,如许你就可以创建和复用特定的产物设置。
  • 客户端(Client):必须将某个生成器对象与主管类关联。一 般情况下,只需通过主管类构造函数的参数举行一次性关联即可。
:步伐中并不一定需要主管类。客户端代码可直接以特定顺序调用创建步骤。不过,主管类中非常适合放入各种例行构造流程,以便在步伐中反复使用。
:差别于其他创造模式,差别的ConcreteBuilder可以生产不相关的产物。Product1和Product2可以不遵循相同的接口。因此在C++如许的静态范例语言中,getResult方法不能放到Builder接口里。
1.5 示例代码

  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. //产品1
  5. class SimpleHouse {
  6. public:
  7.     std::vector<std::string> m_parts;
  8.     void printParts() const {
  9.         std::cout << "SimpleHouse 包括:\n";
  10.         for (int i = 0; i < m_parts.size(); ++i) {
  11.             std::cout << m_parts[i] << std::endl;
  12.         }
  13.         std::cout << "----------------------\n";
  14.     }
  15. };
  16. //生成器
  17. class Builder {
  18. public:
  19.     virtual ~Builder() {}
  20.     virtual void reset() = 0;
  21.     virtual void makeBaseHouse() = 0;
  22.     virtual void makeGarage() = 0;
  23.     virtual void makePool() = 0;
  24. };
  25. //concreteBuilder1,施工队
  26. class SimpleHouseBuilder : public Builder {
  27. private:
  28.     SimpleHouse* m_simplehouse;
  29. public:
  30.     SimpleHouseBuilder() {
  31.         reset();
  32.     }
  33.     ~SimpleHouseBuilder() { delete m_simplehouse; }
  34.     void reset() override{
  35.         m_simplehouse = new SimpleHouse();
  36.     }
  37.     virtual void makeBaseHouse() override{
  38.         m_simplehouse->m_parts.push_back("BaseHouse");
  39.     }
  40.     virtual void makeGarage() override {
  41.         m_simplehouse->m_parts.push_back("Garage");
  42.     }
  43.     virtual void makePool() override {
  44.         m_simplehouse->m_parts.push_back("Pool");
  45.     }
  46.     SimpleHouse* getResult() {
  47.         SimpleHouse* result = m_simplehouse;
  48.         reset();
  49.         return result;
  50.     }
  51. };
  52. //主管:负责流程
  53. class Director {
  54. private:
  55.     Builder* m_builder;
  56. public:
  57.     void setBuilder(Builder* builder) {
  58.         m_builder = builder;
  59.     }
  60.     void makeSimpleHouse() {
  61.         m_builder->makeBaseHouse();
  62.         m_builder->makeGarage();
  63.     }
  64.     void makeFullFuncHouse() {
  65.         m_builder->makeBaseHouse();
  66.         m_builder->makeGarage();
  67.         m_builder->makePool();
  68.     }
  69. };
  70. //客户端(也可以封装成类)
  71. void client(Director* director) {
  72.     std::cout << "客户自己设计流程:---------------------\n";
  73.     SimpleHouseBuilder* builder = new SimpleHouseBuilder();
  74.     builder->makeBaseHouse();
  75.     builder->makeGarage();
  76.     SimpleHouse * simpleHouse= builder->getResult();
  77.     simpleHouse->printParts();
  78.     delete simpleHouse;
  79.     std::cout << "主管负责设计流程:---------------------\n";
  80.     director->setBuilder(builder);
  81.     director->makeFullFuncHouse();
  82.     simpleHouse = builder->getResult();
  83.     simpleHouse->printParts();
  84.     delete simpleHouse;
  85.     delete builder;
  86. }
  87. int main()
  88. {
  89.     Director director;
  90.     client(&director);
  91. }
复制代码
1.6 举个栗子

下面关于生成器模式的例子,演示了怎样复用相同的对象构造代码来生成差别范例的产物:例如汽车(Car)和其相应的使用手册(Manual)。

1.7 总结


  • 将对象的构造过程分解到多少个步骤,这就使步伐可以更加精细,有效地控制整个对象的构造。
  • 生成差别形式的产物时,可以复用相同的制造代码。
  • 单一职责原则。可以将复杂构造代码从产物的业务逻辑中分离出来。
  • 当增加新的详细生成器时,不必修改主管的代码,满足开闭原则。
  • 缺点:如果产物之间的差别性很大,则不适合使用制作者模式,使用范围受到一定的限定。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

十念

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表