ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Builder(建造者)

2020-11-03 10:02:27  阅读:242  来源: 互联网

标签:Product Builder 建造 mBuilder Director part1 part2 void


3. Builder(建造者)

3.1 定义

  将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。4. Prototype(原型)

3.2 适用场景

  使用建造者模式的典型场景如下。

  ■ 相同的方法,不同的执行顺序,产生不同的结果时,可以采用建造者模式。

  ■ 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式。

  ■ 产品类非常复杂,或者产品类中的方法调用顺序不同产生了不同的效能,这个时候使用建造者模式。

  ■ 在对象创建过程中会使用到系统的一些其他对象,这些对象在产品对象的创建过程中不易得到时,也可以采用建造者模式封装该对象的创建过程。该种场景只能是一个补偿方法,因为一个对象不容易获得,而在设计阶段没有发现,要通过创建者模式柔化创建过程,本身已经违反设计的最初目标。

3.3 c++源码

  1 #include <iostream>
  2 #include <string>
  3 
  4 using namespace std;
  5 
  6 // 一个产品由零件1 零件2 构成
  7 //具体的产品类
  8 class Product
  9 {
 10 public:
 11     void setPart1(string part1)
 12     {
 13         m_part1 = part1;
 14     }
 15 
 16     void setPart2(string part2)
 17     {
 18         m_part2 = part2;
 19     }
 20 
 21     string getPart1(){
 22         cout << m_part1 << endl;
 23         return m_part1;
 24     }
 25 
 26     string getPart2(){
 27         cout << m_part2 << endl;
 28         return m_part2;
 29     }
 30 
 31 private:
 32     string m_part1;
 33     string m_part2;
 34 };
 35 
 36 //抽象建造类,提供建造接口。
 37 class OrderBuilder
 38 {
 39 public:
 40     virtual ~OrderBuilder()
 41     {
 42         cout << "~OrderBuilder()" << endl;
 43     }
 44     virtual void setOrderPart1() = 0;
 45     virtual void setOrderPart2() = 0;
 46     virtual Product* getProduct() = 0;
 47 };
 48 
 49 //具体的建造类
 50 class FirstOrderBuilder : public OrderBuilder
 51 {
 52 public:
 53     FirstOrderBuilder()
 54     {
 55         m_Product = new Product;
 56     }
 57 
 58     ~FirstOrderBuilder()
 59     {
 60         cout << "~FirstOrderBuilder()" << endl;
 61         delete m_Product;
 62         m_Product = NULL;
 63     }
 64 
 65     void setOrderPart1()
 66     {
 67         m_Product->setPart1("first part1");
 68     }
 69 
 70     void setOrderPart2()
 71     {
 72         m_Product->setPart2("first part2");
 73     }
 74 
 75     Product* getProduct()
 76     {
 77         return m_Product;
 78     }
 79 
 80 private:
 81     Product* m_Product;
 82 };
 83 
 84 //具体的建造类
 85 class SecondOrderBuilder : public OrderBuilder
 86 {
 87 public:
 88     SecondOrderBuilder()
 89     {
 90         m_Product = new Product;
 91     }
 92 
 93     ~SecondOrderBuilder()
 94     {
 95         cout << "~SecondOrderBuilder()" << endl;
 96         delete m_Product;
 97         m_Product = NULL;
 98     }
 99 
100     void setOrderPart1()
101     {
102         m_Product->setPart1("second part1");
103     }
104 
105     void setOrderPart2()
106     {
107         m_Product->setPart2("second part2");
108     }
109 
110     Product* getProduct()
111     {
112         return m_Product;
113     }
114 
115 private:
116     Product* m_Product;
117 };
118 
119 //Director类,负责管理实例创建的依赖关系,指挥构建者类创建实例
120 class Director
121 {
122 public:
123     Director(OrderBuilder* builder) : m_pOrderBuilder(builder)
124     {
125     }
126     void construct()
127     {
128         m_pOrderBuilder->setOrderPart1();
129         m_pOrderBuilder->setOrderPart2();
130     }
131 
132 private:
133     OrderBuilder* m_pOrderBuilder;
134 };
135 
136 
137 int main()
138 {
139     OrderBuilder* mBuilder = new SecondOrderBuilder;
140     Director* director = new Director(mBuilder);
141     director->construct();
142     Product* order = mBuilder->getProduct();
143     order->getPart1();
144     order->getPart2();
145 
146     delete director;
147     director = NULL;
148 
149     delete mBuilder;
150     mBuilder = NULL;
151 
152 return 0;
153 }

 

标签:Product,Builder,建造,mBuilder,Director,part1,part2,void
来源: https://www.cnblogs.com/46cxf/p/13917847.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有