设计模式读书笔记(三) Builder(建造者)模式
2016-07-02 17:04
615 查看
一、模式介绍
在平常的时候,我们不管是上KFC还是去买组装电脑,我们都会遇到这样一个现象:就是不管我们的需求怎么变化,我们只要点下了我们想要的餐品,服务员下单完毕之后,不用多久,我们的自定义套餐就上来了。这其实就是建造者模式的一个具现化,作为装配工,他不管你需要的是劲辣鸡腿堡还是深海鳕鱼堡,不管你要的是甜筒还是圣代,只要给他一份订单,他就能三下五除二地把你的套餐装配好。
引用一下深入浅出设计模式里的话:GOF 给建造模式的定义为:将一个复杂对象的构建与它的表示分离,使得同样的构建 过程可以创建不同的表示。这句话说得很抽象,不好理解,其实它的意思可以理解为:将构 造复杂对象的过程和组成对象的部件解耦。就像攒电脑一样,不管什么品牌的配件,只要兼 容就可以装上;同样,一样的配件,可以有好多组装的方式。这是对降低耦合、提高可复用 性精神的一种贯彻
下面我们看看UML图的表示:
对于客户来说,只需知道指导者即可(也就是相当于我们在KFC里面遇到的下单员),通过指导者,客户就能构造复杂的对象(一份套餐)
二、模式实现
假设我们现在有一家大型的快餐连锁店,里面可以提供KFC和MC的套餐,客人根据自己下单来选择套餐。先新建一个虚拟的建造者类,里面定义了组装套餐的接口,分别是放入汉堡,饮料和薯条
class Builder { public: Builder(){ cout << "Builder!" << endl; }; virtual ~Builder(){}; virtual void BuildPartHamburger() = 0; virtual void BuildPartDrink() = 0; virtual void BuildPartChips() = 0; };
下面创建具体的套餐建造者
class KFCBuilder :public Builder { public: KFCBuilder() :Builder() { cout << "Welcome to KFC" << endl; } ~KFCBuilder(){}; void BuildPartHamburger() { cout << "KFC Hamburger" << endl; } void BuildPartDrink() { cout << "KFC Drink" << endl; } void BuildPartChips() { cout << "KFC Chips" << endl; } }; class MCBuilder :public Builder { public: MCBuilder() :Builder() { cout << "Welcome to Mc" << endl; } ~MCBuilder(){}; void BuildPartHamburger() { cout << "Mc Hamburger" << endl; } void BuildPartDrink() { cout << "Mc Drink" << endl; } void BuildPartChips() { cout << "Mc Chips" << endl; } };
接下来是指导者的角色:
enum ProductType { KFC, Mc }; class Director { public: Director(ProductType t) :builder(NULL) { switch (t) { case ProductType::KFC: builder = new KFCBuilder(); break; case ProductType::Mc: builder = new MCBuilder(); break; default: cout << "No such Product" << endl; break; } } ~Director() { if (builder) delete builder; builder = NULL; } void Create() { builder->BuildPartHamburger(); builder->BuildPartDrink(); builder->BuildPartChips(); } private: Builder *builder; };
这里面,指导者在Create函数里面指导建造者进行了装配,最后,客户只要告诉指导者他要哪个套餐即可
int main() { Director *director = new Director(ProductType::KFC); director->Create(); delete director; }
输出结果如下:
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- 只需十分钟,结果大不同 |《深度思考》
- 《洋葱阅读法》读书笔记
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- 详解组合模式的结构及其在Ruby设计模式编程中的运用
- C# 设计模式系列教程-建造者模式
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解