学以致用C++设计模式 “建造者模式”
这是一段防爬虫文字,读者可跳过 本文为CSDN作者“看,未来”原创,我的CSDN地址为 https://lion-wu.blog.csdn.net/ 本篇隶属于我的专栏 - 《设计模式 之 设计模式进阶》https://blog.csdn.net/qq_43762191/category_10059121.html 作者版权,未经允许,禁止转载。
多道工艺打造极佳产品
今天,他突发奇想,为什么做汉堡就得是那个顺序呢?为什么不能先把肉烤好,然后凉一会?为什么不能先挤奶油然后把带着奶油的面包拿去烤?为什么要用生菜不用熟菜?
他想着,就决心变革。但是他跟他的员工讲不通啊,员工不理解他,他怒了,他把自己能想到的搭配顺序列成abcdefg等计划,然后告诉员工:“你,给我去做A计划”、“你,给我去做B计划”、“你,给我去做C计划”···
于是一切就这样井然有序的执行了。
那么这件事中涉及到些什么呢? 首先涉及到上一篇 模板方法模式,我说了这俩模式契合度挺高。 然后还涉及到老板那天马行空的abcdefg,是吧,乍一看,好多个模板套一起,咋整?那就是“建造者模式”!
那我们来化成图:
代码实现
#include<iostream>
#include<list>
using namespace std;
class abstracthumber {
public:
virtual void bread() = 0;
virtual void barbecue() = 0;
virtual void cream() = 0;
virtual void lettuce() = 0;
void run() //将共同的核心算法流程提炼到抽象类
{
for (list<string>::iterator it = order->begin(); it != order->end(); it++)
{
if (*it == "bread")
this->bread();
else if (*it == "beef")
this->barbecue();
else if (*it == "cream")
this->cream();
else if (*it == "lettuce")
this->lettuce();
}
}
void set_order(list<string>* s) { this->order = s; }
private:
list<string>* order;
};
class chicken :public abstracthumber {
public:
void bread() { cout << "鸡腿堡的面包" << endl; }
void barbecue() { cout << "鸡腿堡的鸡腿" << endl; }
void cream() { cout << "鸡腿堡的奶油" << endl; }
void lettuce() { cout << "鸡腿堡的生菜" << endl; }
};
class beef :public abstracthumber {
public:
void bread() { cout << "牛肉堡的面包" << endl; }
void barbecue() { cout << "牛肉堡的鸡腿" << endl; }
void cream() { cout << "牛肉堡的奶油" << endl; }
void lettuce() { cout << "牛肉堡的生菜" << endl; }
};
int main()
{
abstracthumber* a = new chicken();
abstracthumber* b = new beef();
list<string> sa ;
sa = { "bread","beef","cream","lettuce" };
a->set_order(&sa);
a->run();
list<string> sb;
sb = { "beef","bread","cream","lettuce" };
b->set_order(&sb);
b->run();
}
我的感悟
如果你是要做一个生产车间,我建议使用模板方法模式,那个不用对流程有太大改变,不需要你天马行空的设计,一切是那么的顺其自然。 如果你要做的是一个乐高积木,那我建议你使用建造者模式,这个模式可以满足你所有的想象,只要你有零件。
建造者模式定义
将一个复杂对象的内部构建与它的表示分离,使得同样的构造过程可以创建不同的表示
在建造者模式中,有如下四个角色:
- 产品类
- 抽象建造者
- 具体建造者
- 导演类(本例中并入main)
建造者模式应用
优势
- 封装性
- 建立者独立,容易拓展
- 便于控制细节风险
使用场景
- 相同的方法,不同的执行顺序吗,产生不同的事件结果。
- 多个部件或零件,都可以包装到一个对像中,但是产生的运行结果又不相同。
- 产品类非常复杂,或者产品类中的调用顺序不同产生不同的效能。
注意事项
建造者模式关注的是零件类型和装配工艺,这是它与工厂模式最大的不同,在使用建造者模式的时候考虑一下模板方法模式,别孤立思考一个模式。
对于工厂模式,重点是创建,创建零件是它的职责,组装顺序不是它该关心的。
好,今天先到这里,明天有点忙,希望能续更。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 谈一谈递归算法
- 二、类加载器与类初始化深度剖析
- PAT (Basic Level) Practice (中文)1030 完美数列 (25 分)
- 八皇后递归实现
- PAT (Basic Level) Practice (中文)1031 查验身份证 (15 分)
- PAT (Advanced Level) Practice 1021 Deepest Root (25 分)
- ESlint + stylelint + VSCode自动格式化代码(2020)
- PAT (Basic Level) Practice (中文)1032 挖掘机技术哪家强 (20 分)
- PAT (Advanced Level) Practice 1023 Have Fun with Numbers (20 分)
- PAT (Basic Level) Practice (中文)1034 有理数四则运算 (20 分)
- 移动端开发的几点建议
- 数据结构题集(严书)图 常见习题代码
- PAT (Basic Level) Practice (中文)1036 跟奥巴马一起编程 (15 分)
- PAT (Advanced Level) Practice 1024 Palindromic Number (25 分)
- Flink 连接 hive 解决 java.net.UnknownHostException