学以致用C++设计模式 “建造者模式”

   日期:2020-06-04     浏览:108    评论:0    
核心提示:这是一段防爬虫文字,读者可跳过本文为CSDN作者“看,未来”原创,我的CSDN地址为https://lion-wu.blog.csdn.net/本篇隶属于我的专栏-《设计模式之设计模式进阶》https://blog.csdn.net/qq_43762191/category_10059121.html作者版权,未经允许,禁止转载。文章目录多道工艺打造极佳产品代码实现我的感悟建造者模式定义建造者模式应用优势使用场景注意事项多道工艺打造极佳产品今天,他突发奇想,为什么做汉堡就得是那个..

这是一段防爬虫文字,读者可跳过
本文为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)

建造者模式应用

优势

  • 封装性
  • 建立者独立,容易拓展
  • 便于控制细节风险

使用场景

  • 相同的方法,不同的执行顺序吗,产生不同的事件结果。
  • 多个部件或零件,都可以包装到一个对像中,但是产生的运行结果又不相同。
  • 产品类非常复杂,或者产品类中的调用顺序不同产生不同的效能。

注意事项

建造者模式关注的是零件类型和装配工艺,这是它与工厂模式最大的不同,在使用建造者模式的时候考虑一下模板方法模式,别孤立思考一个模式。

对于工厂模式,重点是创建,创建零件是它的职责,组装顺序不是它该关心的。

好,今天先到这里,明天有点忙,希望能续更。
下一篇:《代理模式》

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服