相信大家都吃过中餐和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模式强调的是为创建多个相互依赖的对象提供一个同一的接口。