一、模式介绍

在平常的时候,我们不管是上KFC还是去买组装电脑,我们都会遇到这样一个现象:就是不管我们的需求怎么变化,我们只要点下了我们想要的餐品,服务员下单完毕之后,不用多久,我们的自定义套餐就上来了。

这其实就是建造者模式的一个具现化,作为装配工,他不管你需要的是劲辣鸡腿堡还是深海鳕鱼堡,不管你要的是甜筒还是圣代,只要给他一份订单,他就能三下五除二地把你的套餐装配好。

引用一下深入浅出设计模式里的话:GOF 给建造模式的定义为:将一个复杂对象的构建与它的表示分离,使得同样的构建 过程可以创建不同的表示。这句话说得很抽象,不好理解,其实它的意思可以理解为:将构 造复杂对象的过程和组成对象的部件解耦。就像攒电脑一样,不管什么品牌的配件,只要兼 容就可以装上;同样,一样的配件,可以有好多组装的方式。这是对降低耦合、提高可复用 性精神的一种贯彻

下面我们看看UML图的表示:

对于客户来说,只需知道指导者即可(也就是相当于我们在KFC里面遇到的下单员),通过指导者,客户就能构造复杂的对象(一份套餐)

二、模式实现

假设我们现在有一家大型的快餐连锁店,里面可以提供KFC和MC的套餐,客人根据自己下单来选择套餐。

先新建一个虚拟的建造者类,里面定义了组装套餐的接口,分别是放入汉堡,饮料和薯条

class Builder
{
public:Builder(){ cout << "Builder!" << endl; };virtual ~Builder(){};virtual void BuildPartHamburger() = 0;virtual void BuildPartDrink() = 0;virtual void BuildPartChips() = 0;
};

下面创建具体的套餐建造者

class KFCBuilder :public Builder
{
public:KFCBuilder() :Builder(){cout << "Welcome to KFC" << endl;}~KFCBuilder(){};void BuildPartHamburger(){cout << "KFC Hamburger" << endl;}void BuildPartDrink(){cout << "KFC Drink" << endl;}void BuildPartChips() {cout << "KFC Chips" << endl;}};class MCBuilder :public Builder
{
public:MCBuilder() :Builder(){cout << "Welcome to Mc" << endl;}~MCBuilder(){};void BuildPartHamburger(){cout << "Mc Hamburger" << endl;}void BuildPartDrink(){cout << "Mc Drink" << endl;}void BuildPartChips(){cout << "Mc Chips" << endl;}};

接下来是指导者的角色:

enum ProductType
{KFC,Mc
};class Director
{
public:Director(ProductType t) :builder(NULL){switch (t){case ProductType::KFC:builder = new KFCBuilder();break;case ProductType::Mc:builder = new MCBuilder();break;default:cout << "No such Product" << endl;break;}}~Director(){if (builder)delete builder;builder = NULL;}void Create(){builder->BuildPartHamburger();builder->BuildPartDrink();builder->BuildPartChips();}
private:Builder *builder;
};

这里面,指导者在Create函数里面指导建造者进行了装配,最后,客户只要告诉指导者他要哪个套餐即可

int main()
{Director *director = new Director(ProductType::KFC);director->Create();delete director;
}

输出结果如下:

设计模式读书笔记(三) Builder(建造者)模式相关推荐

  1. C#设计模式学习笔记:(4)建造者模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7614630.html,记录一下学习过程以备后续查用.一.引言在现实生活中,我们经常会遇到一些构成比较复杂的物 ...

  2. 大话设计模式读书笔记11----建造者模式(Builder)

    建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的建造过程可以创建不同的表示. 1.Builder是什么? 是创建一个Product对象的各个部件指定的抽象接口. 2.Con ...

  3. Head First设计模式读书笔记三 装饰模式(个人理解:包装模式)

    本文示例代码材料源自Head First设计模式 以前整理自己整理的装饰模式的链接:https://blog.csdn.net/u011109881/article/details/58719049 ...

  4. 设计模式学习笔记三——Abstract Factory模式

    动机:实现一系列相互依赖对象的创建,通过封装系列对象创建来隔离对象创建和客户程序,从而能够灵活提供更多系列对象创建和系列对象间的切换,而不需要改变客户程序. 应用:多种风格软件界面控件的创建.对应多种 ...

  5. 设计模式读书笔记-----工厂方法模式

    一.问题 在前一章<设计模式读书笔记-----简单工厂模式>中通过披萨的实例介绍了简单工厂模式.在披萨实例中,如果我想根据地域的不同生产出不同口味的披萨,如纽约口味披萨,芝加哥口味披萨.如 ...

  6. 《Head First设计模式》 读书笔记16 其余的模式(二) 蝇量 解释器 中介者

    <Head First设计模式> 读书笔记16 其余的模式(二) 蝇量 解释器 中介者 蝇量(Flyweight Pattern) 如想让某个类的一个实例能用来提供许多"虚拟实例 ...

  7. Java设计模式之创建型:建造者模式

    一.什么是建造者模式: 建造者模式将复杂产品的创建步骤分解在在不同的方法中,使得创建过程更加清晰,从而更精确控制复杂对象的产生过程:通过隔离复杂对象的构建与使用,也就是将产品的创建与产品本身分离开来, ...

  8. 大话设计模式读书笔记

    主题 概要 设计模式 大话设计模式读书笔记 编辑 时间 新建 20170423 序号 参考资料 1 大话设计模式 重新看了一遍设计模式,除了一些已经特别熟悉的模式,都自己敲了一遍代码,有些豁然开朗的感 ...

  9. JavaScript设计模式读书笔记(一)= 创建型设计模式

    全系列目录 JavaScript设计模式读书笔记(一)=> 创建型设计模式 JavaScript设计模式读书笔记(二)=> 结构型设计模式 JavaScript设计模式读书笔记(三)=&g ...

  10. JavaScript设计模式读书笔记(四)= 技巧型设计模式

    全系列目录 JavaScript设计模式读书笔记(一)=> 创建型设计模式 JavaScript设计模式读书笔记(二)=> 结构型设计模式 JavaScript设计模式读书笔记(三)=&g ...

最新文章

  1. 概念被滥用 你真的了解云计算吗?
  2. 16 个 Redis 常见使用场景
  3. 【Windows 逆向】OD 调试器工具 ( CE 工具通过查找访问的方式找到子弹数据基地址 | 使用 OD 工具附加游戏进程 | 在 OD 工具中查看 05869544 地址数据 | 仅做参考 )
  4. [原创]微软网络协议数据分析工具 Microsoft Network Monitor 介绍
  5. C#开发之问题汇总-vs运行正常,服务器IIS上报未能加载程序集
  6. 一个顾客买了价值x元的商品(C语言)
  7. iPhone/Mac Objective-C内存管理教程和原理剖析(二)口诀与范式转
  8. javascript设计模式_详解JavaScript的常用设计模式(二)
  9. Python向数据库表格里插入万级数据
  10. Eclipse ADT插件版本下载大全
  11. SetTimer函数的使用
  12. 椭球面的c语言方程,喷油嘴椭球面手工编程方法的实现
  13. Windows语言栏不见了,解决办法。任务栏的语言栏没了、不显示了。语言栏异常导致不能输入中文。默认中文输入法设置。
  14. 人工智能聊天机器人(有详细安装教程)/ 自动学习型
  15. 怎么把dicom数据转成nifty数据
  16. CSS margin 用法
  17. html5卡片平行视差效果,HTML5/jQuery很棒的交互式平行视差皓月当空场景动画
  18. Zookeeper1:相关理论
  19. 每周好书推荐《那些古怪又令人忧心的问题》
  20. 强化学习初探索——Q-table 举例,附可执行Python代码

热门文章

  1. 啥子?软件测试-白盒测试
  2. 2020-08-17:为什么HashMap中数组的容量为2的次幂?
  3. 利用地球同步卫星在一个1Mbps的信道上发送长度为1000位的帧,该信道的传播延时为27Frames of 1000 bits are sent over a 1-Mbps channel using
  4. N1 小钢炮docker安装迅雷方法
  5. PCL点云库(Point Cloud Library)简介
  6. GE Proficy CIMPLICITY如何实现跨版本升级操作?
  7. 服务器配置和部署(待完善)
  8. 那些年,我们一起做过的 Java 课后练习题(66 - 70)
  9. 2018 51信用卡春招后端开发实习题解
  10. Android【Socket通讯】