建造者模式

xiaoxiao2021-02-28  101

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

转载请注明原文地址: https://www.6miu.com/read-66031.html

最新回复(0)