建造者模式

相信大家都吃过中餐和KFC,这两种东西有什么区别呢?你吃一万个师傅炒出来的酸辣土豆丝可能有一万种味道,但是你吃一万家KFC大概会有一种味道。为什么呢,因为一万个师傅某个师傅可能忘记放盐了,另一个忘记放醋了,但是KFC是一套标准化流程,所以出来就是一个味道。那么怎么才能将中餐变成一个味道呢?那就是标准化流程,否者不让出厂。

在软件设计中有什么应用场景呢?比如你在电脑上玩极品飞车游戏,每一关地图都会有变化,天气又阴晴之分,你需要根据阴天和晴天对整个画面进行渲染,但是这两个渲染过程是固定的,因此需要你把整个流程都要走完,这是一个标准化流程。

建造者模式:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式通常包括下面几个角色:
1. builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。
2. ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例。
3. Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
4. Product:要创建的复杂对象,由多个部件构成。

假设你去追多个国家的妹纸,你不会多国语言怎么办呢,你需要建造一个机器人,每个机器人都有两个功能,说我爱你,还替你送花。

#include<iostream>
#include<vector>
#include<list>
#include<string>
using namespace std;
class Product//我们想要的产品
{
private:
	list<string>parts;//存放产品的部件;
public:
	void add(string part)//往产品里添加部件
	{
		parts.push_back(part);
	}
	void  show()
	{
		cout << "The real Product" << endl;
		for (list<string>::iterator p = parts.begin(); p != parts.end(); p++)
		{
			cout << *p << endl;
		}
	}
};
class Builder//抽象类,建造机器人需要的流程, 建造产品的接口,都需要使用纯虚函数,这样保证建造时走完所有的流程,否者无法实例化
{
public:
	virtual void say() = 0;
	virtual void sendflow() = 0;
	virtual Product& getResult() = 0;//建造好了要能让人获取到产品
};
class EngBuilder :public Builder//建造为英国机器人
{
private:
	Product product;//存放建造的产品
public:
	void say()
	{
		product.add("English say I love you");
		cout << "English say I love you" << endl;
	}
	void sendflow()
	{
		product.add("Send your English flower");
		cout << "Send your English flower" << endl;
	}
	Product& getResult()
	{
		return product;
	}
};
class ChiBuilder :public Builder//建造中国机器人
{
private:
	Product product;
public:
	void say()
	{
		product.add("中文我爱你");
		cout << "中文我爱你" << endl;
	}
	void sendflow()
	{
		product.add("Send your China flower");
		cout << "Send your China flower" << endl;
	}
	Product& getResult()
	{
		return product;
	}
};
class Director//负责调用具体建造者来建造对象的各个部分,
{
private:
	Builder *p;
public:
	Director(Builder *temp)
	{
		p = temp;
	}
	void create()//负责创建产品,从这里看,他并不知道建造产品的具体信息,起到统一接口的作用,所有的产品建造过程统一起来
	{
		p->say();
		p->sendflow();
	}
};
int main()
{
	Builder *p = new EngBuilder();//
	Director *d = new Director(p);//我要建造一个英文的机器人
	d->create();//开始造这机器人
	Product pro = p->getResult();//拿出产品;
	pro.show();//展示产品
	delete p;
	delete d;
} 

     Builder模式强调的是一步步创建对象,并通过相同的创建过程可以获得不同的结果对象,一般来说Builder模式中对象不是直接返回的。而在AbstractFactory模式中对象是直接返回的,AbstractFactory模式强调的是为创建多个相互依赖的对象提供一个同一的接口。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值