作用:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

Builder模式和AbstractFactory模式在功能上很相似,因为都是用来创建大的复杂的对象,它们的区别是:Builder模式强调的是一步步创建对象,并通过相同的创建过程可以获得不同的结果对象,一般来说Builder模式中对象不是直接返回的。而在AbstractFactory模式中对象是直接返回的,AbstractFactory模式强调的是为创建多个相互依赖的对象提供一个同一的接口。

适用于以下情况:

1)当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。

2)当构造过程必须允许被构造的对象有不同的表示时。

UML图如下:

Builder:定义创建对象过程的抽象,提供构建不同组成部分的接口

其中:BuildPartA,BuildPartB,BuildPartC是对一个对象不同部分的构建函数接口,由Builder的派生类ConcreteBuilder1、ConcreteBuilder2来具体实现.
另外还有一个需要注意的函数,就是Director::Construct函数,这个函数里面通过调用上面的接口函数完成对象的构建--也就是说各个不同部分装配的过程都是一致的(同样的调用的Construct函数),但是不同的构建方式会有不同的表示(根据Builder的实际类型来决定如何构建,也就是多态)

Builder模式是基于这样的一个情况:一个对象可能有不同的组成部分,这几个部分的不同的创建对象会有不同的表示,但是各个部分之间装配的方式是一致的.比方说一辆单车,都是由车轮车座等等的构成的(一个对象不同的组成部分),不同的品牌生产出来的也不一样(不同的构建方式).虽然不同的品牌构建出来的单车不同,但是构建的过程还是一样的

也就是说,Director::Construct函数中固定了各个组成部分的装配方式,而具体是装配怎样的组成部分由Builder的派生类实现.

实现:
Builder模式的实现基于以下几个面向对象的设计原则:

1)把变化的部分提取出来形成一个基类和对应的接口函数,在这里不会变化的是都会创建PartA和PartB,变化的则是不同的创建方法,于是就抽取出这里的Builder基类和BuildPartA,BuildPartB接口函数

2)采用聚合的方式聚合了会发生变化的基类,就是这里Director聚合了Builder类的指针.

以上,通过两个派生类ConcreteBuilder1、ConcreteBuilder2定义了两种不同的建造细节(建造步骤是一样的,由Construct函数确定),通过两个派生类所建造出来的对象,对外部所展现出来的属性或者功能是不一样的,由各自Builder派生类中的建造方法(BuildPartA、BuildPartB、BuildPartC)决定。

代码如下:

Builder.h

 1 #ifndef _BUILDER_H_
 2 #define _BUILDER_H_
 3
 4 #include <string>
 5 #include <vector>
 6
 7 using namespace std;
 8
 9 //产品类
10 class Product
11 {
12 private:
13     string m_partA;
14     string m_partB;
15     string m_partC;
16 public:
17     void setPartA(const string& s);
18     void setPartB(const string& s);
19     void setPartC(const string& s);
20     Product();
21     ~Product();
22 };
23
24 //抽象Builder基类,定义不同部分的创建接口
25 class Builder
26 {
27 public:
28     virtual void BuildPartA()=0;
29     virtual void BuildPartB()=0;
30     virtual void BuildPartC()=0;
31     virtual Product* GetProduct()=0;
32     Builder();
33     virtual ~Builder();
34 };
35
36 //  Builder的派生类,实现BuilderPartA和BuilderPartB和BuildPartC接口函数
37 class ConcreteBuilder1:public Builder
38 {
39 public:
40     ConcreteBuilder1();
41     ~ConcreteBuilder1();
42     virtual void BuildPartA();
43     virtual void BuildPartB();
44     virtual void BuildPartC();
45     virtual Product* GetProduct();
46 private:
47     Product* m_pProduct;
48 };
49
50 //  Builder的派生类,实现BuilderPartA和BuilderPartB和BuildPartC接口函数
51 class ConcreteBuilder2:public Builder
52 {
53 public:
54     ConcreteBuilder2();
55     ~ConcreteBuilder2();
56     virtual void BuildPartA();
57     virtual void BuildPartB();
58     virtual void BuildPartC();
59     virtual Product* GetProduct();
60 private:
61     Product* m_pProduct;
62 };
63
64 //ConcreteBuilder1与ConcreteBuilder2是Builder的两个派生类,用于实现两种不同的建造细节
65
66  // 使用Builder构建产品,构建产品的过程都一致,但是不同的builder有不同的实现
67  // 这个不同的实现通过不同的Builder派生类来实现,存有一个Builder的指针,通过这个来实现多态调用
68 class Director
69 {
70 public:
71     Director(Builder* pBuilder);
72     ~Director();
73
74     //Construct函数定义一个对象的整个构建过程,不同的部分之间的装配方式都是一致的,
75     //首先构建PartA其次是PartB,只是根据不同的构建者会有不同的表示
76     void Construct();
77     //void Construct(const string& buildPara);
78 private:
79     Builder* m_pBuilder;
80 };
81
82 #endif

Director.cpp

  1 #include "Builder.h"
  2 #include <iostream>
  3 #include <vector>
  4
  5 using namespace std;
  6
  7 Product::~Product()
  8 {
  9 }
 10
 11 Product::Product()
 12 {}
 13
 14 void Product::setPartA(const string& s)
 15 {
 16     this->m_partA = s;
 17 }
 18
 19 void Product::setPartB(const string& s)
 20 {
 21     this->m_partB = s;
 22 }
 23
 24 void Product::setPartC(const string& s)
 25 {
 26     this->m_partC = s;
 27 }
 28
 29 Builder::Builder()
 30 {}
 31
 32 Builder::~Builder()
 33 {}
 34
 35 ConcreteBuilder1::ConcreteBuilder1()
 36 {
 37     this->m_pProduct = new Product();
 38     cout<<"Create empty product!"<<endl;
 39 }
 40
 41 void ConcreteBuilder1::BuildPartA()
 42 {
 43     this->m_pProduct->setPartA("A");
 44     cout<<"BuildPartA"<<endl;
 45 }
 46
 47 void ConcreteBuilder1::BuildPartB()
 48 {
 49     this->m_pProduct->setPartB("B");
 50     cout<<"BuildPartB"<<endl;
 51 }
 52
 53 void ConcreteBuilder1::BuildPartC()
 54 {
 55     this->m_pProduct->setPartC("C");
 56     cout<<"BuildPartC"<<endl;
 57 }
 58
 59 Product* ConcreteBuilder1::GetProduct()
 60 {
 61     return this->m_pProduct;
 62 }
 63
 64 ConcreteBuilder1::~ConcreteBuilder1()
 65 {
 66     delete this->m_pProduct;
 67     this->m_pProduct = NULL;
 68 }
 69
 70 ConcreteBuilder2::ConcreteBuilder2()
 71 {
 72     this->m_pProduct = new Product();
 73     cout<<"Create empty product!"<<endl;
 74 }
 75
 76 void ConcreteBuilder2::BuildPartA()
 77 {
 78     this->m_pProduct->setPartA("A");
 79     cout<<"BuildPartA"<<endl;
 80 }
 81
 82 void ConcreteBuilder2::BuildPartB()
 83 {
 84     this->m_pProduct->setPartB("B");
 85     cout<<"BuildPartB"<<endl;
 86 }
 87
 88 void ConcreteBuilder2::BuildPartC()
 89 {
 90     this->m_pProduct->setPartC("C");
 91     cout<<"BuildPartC"<<endl;
 92 }
 93
 94 Product* ConcreteBuilder2::GetProduct()
 95 {
 96     return this->m_pProduct;
 97 }
 98
 99 ConcreteBuilder2::~ConcreteBuilder2()
100 {
101     delete this->m_pProduct;
102     this->m_pProduct = NULL;
103 }
104
105 Director::Director(Builder* pBuilder)
106 {
107     this->m_pBuilder = pBuilder;
108 }
109
110 void Director::Construct()
111 {
112     this->m_pBuilder->BuildPartA();
113     this->m_pBuilder->BuildPartB();
114     this->m_pBuilder->BuildPartC();
115 }
116
117 Director::~Director()
118 {
119     delete this->m_pBuilder;
120     this->m_pBuilder = NULL;
121 }

main.cpp

 1 #include "Builder.h"
 2 #include <iostream>
 3
 4 using namespace std;
 5
 6 int main()
 7 {
 8     Director* pDirector = new Director(new ConcreteBuilder1());
 9     pDirector->Construct();
10
11     Director* pDirector1 = new Director(new ConcreteBuilder2());
12     pDirector1->Construct();
13
14     return 0;
15 }

建造者模式和工厂模式非常相似呀,但是记住一点你就可以游刃有余的使用了:

建造者模式最主要功能是基本方法的调用顺序安排,也就是这些基本方法已经实现了;

而工厂方法则重点是创建,你要什么对象我创造一个对象出来,组装顺序则不是他关心的。

建造者模式使用的场景,一是产品类非常的复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式是非常合适

C++设计模式-Builder建造者模式相关推荐

  1. 设计模式之建造者模式(生成器模式、Builder)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...

  2. C#设计模式之四建造者模式(Builder Pattern)【创建型】

    一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一 ...

  3. D5:C#设计模式之四建造者模式(Builder Pattern)【创建型】

    一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一 ...

  4. 建造者模式java_java设计模式3——建造者模式

    java设计模式3--建造者模式 1.建造者模式介绍: 建造者模式属于创建型模式,他提供了一种创建对象得最佳方式 定义: 将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示 主 ...

  5. Java设计模式(建造者模式-适配器模式-桥接模式)

    Java设计模式Ⅲ 1.建造者模式 1.1 建造者模式概述 1.2 建造者模式的注意事项和细节 1.3 代码理解 2.适配器模式 2.1 类适配器模式 2.1.1 代码理解 2.2 对象适配器模式 2 ...

  6. 折腾Java设计模式之建造者模式

    博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...

  7. java设计模式 建造模式_理解java设计模式之建造者模式

    理解java设计模式之建造者模式 发布于 2020-12-10| 复制链接 摘记: 建造者模式(Builder Pattern)主要用于"分步骤构建一个复杂的对象",在这其中&qu ...

  8. 建造者模式 php,PHP设计模式之建造者模式定义与用法简单示例

    本文实例讲述了PHP设计模式之建造者模式.分享给大家供大家参考,具体如下: 建造者模式: 将复杂对象的创建过程和表示进行分离(好吧,我也看不懂什么意思1). 来点我人类能听懂的话: 1.在客户端看来需 ...

  9. 学习《图说设计模式》建造者模式

    图说设计模式之建造者模式 1. 模式动机 无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分,如汽车,它包括车轮.方向盘.发送机等各种部件.而对于大多数用户而言,无须知道这 ...

最新文章

  1. 北斗导航 | GPS 信号频谱分析
  2. ssm整合之七 事务以及404页面处理
  3. [kubernetes] 资源管理 ---- 资源请求和限制
  4. 记录一次查询log的经历
  5. php nsdata,iOS开发之数据存储之NSData
  6. 生成随机测试数据的文件的程序
  7. datastage配置jdbc_DataStage 错误集(持续更新)
  8. chart放入panel_使用JPanel将ChartPanel添加到JTabbedPane
  9. 政企上云正当时,华为云12.12大促助力中小企业数字转型升级
  10. AB=0与伴随矩阵相互作用型题
  11. Linux服务器创建及维护记录
  12. 55欧式空间02——标椎正交基、Schmidt 正交化、正交矩阵、欧氏空间的同构、QR分解
  13. 2008-03-17 淋湿的心情
  14. java中如何获得方法中的参数名
  15. OpenCV通过cvFindContours与cvDrawCountours函数查找轮廓
  16. Maven打包时指定配置文件
  17. c语言表达式判断语法错误题,C语言数据类型与表达式习题及答案.doc
  18. 2022软件测试技能 Fiddler HTTP抓包调试工具完整详细教程
  19. amd锐龙CPU A320系列主板如何安装win7
  20. 提高软件开发效率的方法

热门文章

  1. centos linux下vnc server远程桌面配置详解,CentOS 6.0 VNC远程桌面配置
  2. JAVA题目 写一个收费站类_Java综合题目
  3. 一个函数统一238个机器学习R包,这也太赞了吧
  4. 这篇纯数据分析文章被拒8次,发到行业顶刊
  5. java 类 加载 初始化_java类的加载与初始化
  6. python定时执行脚本实例
  7. 【三】Java运算符
  8. ios label文字行间距_iOS- 设置label的行间距字体间距
  9. Linux笔记-压缩包安装jdk1.7(bash与.cshrc)
  10. Linux工作笔记-使用find和grep检索文件或子文件中是否包含指定字符串