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

时间:2022-07-23
本文章向大家介绍学以致用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)

建造者模式应用

优势

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

使用场景

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

注意事项

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

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


好,今天先到这里,明天有点忙,希望能续更。