设计模式读书笔记(三) Builder(建造者)模式
一、模式介绍
在平常的时候,我们不管是上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(建造者)模式相关推荐
- C#设计模式学习笔记:(4)建造者模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7614630.html,记录一下学习过程以备后续查用.一.引言在现实生活中,我们经常会遇到一些构成比较复杂的物 ...
- 大话设计模式读书笔记11----建造者模式(Builder)
建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的建造过程可以创建不同的表示. 1.Builder是什么? 是创建一个Product对象的各个部件指定的抽象接口. 2.Con ...
- Head First设计模式读书笔记三 装饰模式(个人理解:包装模式)
本文示例代码材料源自Head First设计模式 以前整理自己整理的装饰模式的链接:https://blog.csdn.net/u011109881/article/details/58719049 ...
- 设计模式学习笔记三——Abstract Factory模式
动机:实现一系列相互依赖对象的创建,通过封装系列对象创建来隔离对象创建和客户程序,从而能够灵活提供更多系列对象创建和系列对象间的切换,而不需要改变客户程序. 应用:多种风格软件界面控件的创建.对应多种 ...
- 设计模式读书笔记-----工厂方法模式
一.问题 在前一章<设计模式读书笔记-----简单工厂模式>中通过披萨的实例介绍了简单工厂模式.在披萨实例中,如果我想根据地域的不同生产出不同口味的披萨,如纽约口味披萨,芝加哥口味披萨.如 ...
- 《Head First设计模式》 读书笔记16 其余的模式(二) 蝇量 解释器 中介者
<Head First设计模式> 读书笔记16 其余的模式(二) 蝇量 解释器 中介者 蝇量(Flyweight Pattern) 如想让某个类的一个实例能用来提供许多"虚拟实例 ...
- Java设计模式之创建型:建造者模式
一.什么是建造者模式: 建造者模式将复杂产品的创建步骤分解在在不同的方法中,使得创建过程更加清晰,从而更精确控制复杂对象的产生过程:通过隔离复杂对象的构建与使用,也就是将产品的创建与产品本身分离开来, ...
- 大话设计模式读书笔记
主题 概要 设计模式 大话设计模式读书笔记 编辑 时间 新建 20170423 序号 参考资料 1 大话设计模式 重新看了一遍设计模式,除了一些已经特别熟悉的模式,都自己敲了一遍代码,有些豁然开朗的感 ...
- JavaScript设计模式读书笔记(一)= 创建型设计模式
全系列目录 JavaScript设计模式读书笔记(一)=> 创建型设计模式 JavaScript设计模式读书笔记(二)=> 结构型设计模式 JavaScript设计模式读书笔记(三)=&g ...
- JavaScript设计模式读书笔记(四)= 技巧型设计模式
全系列目录 JavaScript设计模式读书笔记(一)=> 创建型设计模式 JavaScript设计模式读书笔记(二)=> 结构型设计模式 JavaScript设计模式读书笔记(三)=&g ...
最新文章
- 概念被滥用 你真的了解云计算吗?
- 16 个 Redis 常见使用场景
- 【Windows 逆向】OD 调试器工具 ( CE 工具通过查找访问的方式找到子弹数据基地址 | 使用 OD 工具附加游戏进程 | 在 OD 工具中查看 05869544 地址数据 | 仅做参考 )
- [原创]微软网络协议数据分析工具 Microsoft Network Monitor 介绍
- C#开发之问题汇总-vs运行正常,服务器IIS上报未能加载程序集
- 一个顾客买了价值x元的商品(C语言)
- iPhone/Mac Objective-C内存管理教程和原理剖析(二)口诀与范式转
- javascript设计模式_详解JavaScript的常用设计模式(二)
- Python向数据库表格里插入万级数据
- Eclipse ADT插件版本下载大全
- SetTimer函数的使用
- 椭球面的c语言方程,喷油嘴椭球面手工编程方法的实现
- Windows语言栏不见了,解决办法。任务栏的语言栏没了、不显示了。语言栏异常导致不能输入中文。默认中文输入法设置。
- 人工智能聊天机器人(有详细安装教程)/ 自动学习型
- 怎么把dicom数据转成nifty数据
- CSS margin 用法
- html5卡片平行视差效果,HTML5/jQuery很棒的交互式平行视差皓月当空场景动画
- Zookeeper1:相关理论
- 每周好书推荐《那些古怪又令人忧心的问题》
- 强化学习初探索——Q-table 举例,附可执行Python代码
热门文章
- 啥子?软件测试-白盒测试
- 2020-08-17:为什么HashMap中数组的容量为2的次幂?
- 利用地球同步卫星在一个1Mbps的信道上发送长度为1000位的帧,该信道的传播延时为27Frames of 1000 bits are sent over a 1-Mbps channel using
- N1 小钢炮docker安装迅雷方法
- PCL点云库(Point Cloud Library)简介
- GE Proficy CIMPLICITY如何实现跨版本升级操作?
- 服务器配置和部署(待完善)
- 那些年,我们一起做过的 Java 课后练习题(66 - 70)
- 2018 51信用卡春招后端开发实习题解
- Android【Socket通讯】