建造者模式

代码仓库地址:建造者模式

Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种。Builder模式是一种对象创建模式之一,用来隐藏复合对象的创建过程。他把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。

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

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

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

适用情况:

​ 一个对象的构建比较复杂,将一个对象的构建和对象的表示进行分离。

说白了:建造者模式,其实就是相当于一个设计师,指挥建造师造房子,建造师可能是不同的,因为每个建造师建造水平和会造的房子都是不一样的。

创建者模式和工厂模式的对比

Factory模式中:

  1. 有一个抽象的工厂
  2. 实现一个具体的工厂 - 汽车工厂
  3. 工厂生产的汽车A,得到汽车产品A
  4. 工厂生产汽车B,得到汽车产品B

实现了购买者和生产线的隔离,强调的是结果

Builder模式

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

这样做,目的是为了实现复杂对象生产线和其部件的解耦。强调的是过程

两者的区别在于以下几种情况:

工厂模式不考虑对象的组装过程,而直接生成一个我想要的对象。

Builder模式先一个个的创建对象的每一个部件,再统一组装成一个对象

工厂模式所解决的问题是,工厂生产产品

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

前期问题的抛出-需要建造者模式的原因

#include <iostream>
#include <string>
using namespace std;class House
{public:void setDoor(string door){this->m_door = door;}void setWall(string wall){this->m_wall = wall;}void setWindow(string window){this->m_window = window;}string getDoor(void){cout << m_door << endl;return m_door;}string getWall(void){cout << m_wall << endl;return m_wall;}string getWindow(void){cout << m_window << endl;;return m_window;}private:string m_door;string m_wall;string m_window;
};class Builder
{public:Builder(void){m_house = new House;}~Builder(void){delete m_house;}void MakeBuilder(void){BuildDoor(m_house);BuildWall(m_house);BuildWindow(m_house);}void BuildDoor(House *h){h->setDoor("door");}void BuildWall(House *h){h->setWall("wall");}void BuildWindow(House *h){h->setWindow("window");}House *GetHouse(void){return m_house;}private:House *m_house;
};int main(int argc, char const *argv[])
{// 不需要建造者,客户直接造房子//  门窗  墙体玻璃等都需要用户管理House *house = new House;house->setDoor("user door");house->setWall("user Wall");house->setWindow("big window");house->getDoor();house->getWall();house->getWindow();delete house;// 华丽的分割线cout << "=========================" << endl;// 请工程队 建造房子// 将建造过程交给工程队, 是不是还可以请个指挥建造的? 这样客户就能完全解放出来了Builder *builder = new Builder;builder->MakeBuilder();house = builder->GetHouse();house->getDoor();house->getWall();house->getWindow();delete builder;cout << "builder pattern." << endl;return 0;
}

两者,虽然都建造好了房子,但是建筑队参加之后,客户就不需要参与房子的建造的每个过程了,将建造过程与使用者之间进行分离,这就是建造者模式想要达到的效果

andrew@andrew-G3-3590:/work/linux-sys/DesignPatterns/cpp/build$ ./builder_pattern_question
user door
use Wall
big window
=========================
door
wall
window
builder pattern.

那除了这样其实可以再请一个指挥者过来,因为实际中会有不同的建造者参与竞争,每个建造者精通的地方都是不一样的,指挥者参与之后,用户只需要把自己的需求告知指挥者就行。

  • 建造者模式,就是通过虚工程对基类,实现通过指挥者,指挥不同的建筑队建设不同的房子
#include <iostream>
#include <string>
using namespace std;// 建造者模式,就是通过虚工程对基类,实现
// 通过指挥者,指挥不同的建筑队建设不同的房子class House
{public:void setDoor(string door){this->m_door = door;}void setWall(string wall){this->m_wall = wall;}void setWindow(string window){this->m_window = window;}string getDoor(void){cout << m_door << endl;return m_door;}string getWall(void){cout << m_wall << endl;return m_wall;}string getWindow(void){cout << m_window << endl;;return m_window;}private:string m_door;string m_wall;string m_window;
};class Builder
{public:virtual void BuildWall(void) = 0;virtual void BuildDoor(void) = 0;virtual void BuildWindow(void) = 0;virtual House* GetHouse(void) = 0;
public:virtual ~Builder(void){}
};//公寓建筑工程队
class FlatBuilder : public Builder
{public:FlatBuilder(){m_house = new House;}virtual void BuildWall(void){m_house->setWall("flat wall");}virtual void BuildDoor(void){m_house->setDoor("flat door");}virtual void BuildWindow(void){m_house->setWindow("flat window");}virtual House* GetHouse(void){return m_house;}private:House *m_house;
};// 别墅工程队
class VillaBuilder : public Builder
{public:VillaBuilder(void){m_house = new House;}virtual void BuildWall(void){m_house->setWall("villa wall");}virtual void BuildDoor(void){m_house->setDoor("villa door");}virtual void BuildWindow(void){m_house->setWindow("villa window");}virtual House* GetHouse(void){return m_house;}private:House *m_house;
};// 设计师 指挥者,负责建造的逻辑
// 建筑队,干具体的活
class Director
{public:Director(Builder *builder){m_build = builder;}void Construct(void){m_build->BuildWall();m_build->BuildWindow();m_build->BuildDoor();}private:Builder * m_build;
};int main(int argc, char const *argv[])
{House       *house = NULL;Builder     *builder = NULL;Director    *director = NULL;cout << "villa build" << endl;// 请一个建造别墅的工程队,建造一个别墅builder = new VillaBuilder;// 设计师 指挥工程队进行建造director = new Director(builder);// 指挥干活director->Construct();// 建好 交工house = builder->GetHouse();// 客户验房house->getWindow();house->getDoor();house->getWall();delete house;delete builder;cout << "flat build" << endl;builder = new FlatBuilder;director = new Director(builder);director->Construct();house = builder->GetHouse();house->getDoor();house->getWall();house->getWindow();delete house;delete builder;delete director;cout << "builder pattern." << endl;return 0;
}

23种设计模式C++源码与UML实现--建造者模式相关推荐

  1. 23种设计模式C++源码与UML实现--外观模式

    外观模式 facade模式也叫外观模式,是由GoF提出的23种设计模式中的一种,facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单界面.这个一致的简单的界面被称为fac ...

  2. 23种设计模式C++源码与UML实现--迭代器模式

    迭代器模式 Iterator模式也叫迭代模式,是行为模式之一,他把对容器种包含的内部对象的访问委让给外部类,使用Iterator按顺序进行遍历访问的设计模式. 在使用Iterator模式之前,首先应该 ...

  3. 23种设计模式C++源码与UML实现--命令模式

    命令模式 Command模式也叫命令模式,是行为设计模式的一种.Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数. 在面向对象的程序设计中,一个对象调用另外一个对象 ...

  4. 23种设计模式C++源码与UML实现--原型模式

    原型模式 一个复杂对象,具有自我复制功能,统一一套接口. 原型模式主要面对的问题是:某些结构复杂的对象的创建工作,由于需求的变化,这些对象进场面对着剧烈的变化,但是他们却拥有比较一致的接口. 原型模式 ...

  5. 23种设计模式C++源码与UML实现--桥接模式

    桥接模式 Bridge模式,又叫做桥接模式,是构造型的设计模式之一.Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为让类承担不同的责任.它的主要特点是把抽象(Abstractio ...

  6. 23种设计模式C++源码与UML实现--状态模式

    状态模式 State模式也叫状态模式,是行为模式的一种,State模式允许通过改变对象的内部状态而改变对象的行为,这个对象变现的好像修改了它的类一样. 状态模式主要解决的事当控制一个对象状态的条件表达 ...

  7. 23种设计模式C++源码与UML实现--策略模式

    策略模式 Strategy模式也叫策略模式,是行为模式之一,它对一系列的算法加以封装,为所有算法定义一个抽象算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交给客户端决定. ...

  8. 23种设计模式C++源码与UML实现--组合模式

    组合模式 Composite模式也叫做组合模式,是构造型的设计模式之一.通过递归的手段构造树形的对象结构,并可以通过一个对象来访问整个对象树. Component树形结构的节点抽象 为所有的对象定义统 ...

  9. 23种设计模式C++源码与UML实现--工厂模式

    工厂模式 工厂方法模式同样属于类的创建型模式,又被称为多态工厂模式.工厂方法的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中. 核心工厂类不在负责产品的创建,这样核心类成为一个抽象 ...

最新文章

  1. 微软图像加密算法被破解,谷歌等大厂都在用,MIT硕士小哥开源逆向所用方法...
  2. 【Qt】Qt登录对话框(纯代码实现)
  3. 麒麟9905g版会用鸿蒙系统吗视频,几乎纯国产!华为P40顶级旗舰:麒麟990+5G网+鸿蒙系统...
  4. 机器学习-机器学习概论(入门机器学习基础知识)
  5. 1262. 可被三整除的最大和(贪心||动态规划)
  6. linux共享库及/etc/ld.so.conf文件的应用
  7. oracle sysauth,sysauth$基表的用户权限的一点分析
  8. 8-1 数据结构图的主要遍历实验流程图_ReactDOM渲染流程图
  9. NVIDIA-SMI has failed because it couldn’t communicate with the NVIDIA driver.
  10. check GPU mem size on condor
  11. 谷歌真是厉害,这次成了公敌!
  12. 网站限制IP访问应该怎么办
  13. Linux下编写GT911触摸驱动
  14. 如何搭建免费图床给Typora使用(PicGo + Gitee(码云)实现markdown图床)
  15. ubuntu12.04.4安装tcl/tk和Tkinter
  16. 科技型中小企业研发费用加计扣除问题解答
  17. 2022全国大学生物联网设计竞赛火热开启,限量礼品等你来拿
  18. “Cache-主存”和“主存和辅存”的区别
  19. 函数极限和无穷大 函数各种情况极限的定义
  20. 阿里自然语言处理部总监分享:NLP技术的应用及思考

热门文章

  1. Patrol 7 架构下?的处理方法
  2. 教你配CISCO RIP(二)
  3. Eclispse中Run on Server窗口让选择Server,但已经存在的选择不了
  4. javascript——原型与原型链
  5. .Net Core中使用RabbitMQ
  6. 数组的一些与遍历相关的方法总结
  7. 网络基础知识——以太网
  8. 大道至简第一章读后感(伪代码)
  9. 设计模式——策略模式(C++实现)
  10. 【转】 MySQL索引类型一览 让MySQL高效运行起来 mysql索引注意事项