建造者模式

来源:互联网 发布:网络项目投标书 编辑:程序博客网 时间:2024/06/15 19:36
1.定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

《大话设计模式》举了一个很好的例子——建造小人,一共需建造6个部分,头部、身体、左右手、左右脚。与工厂模式不同,建造者模式是在导向者的控制下一步一步构造产品的。建造小人就是在控制下一步步构造出来的。创建者模式可以能更精细的控制构建过程,从而能更精细的控制所得产品的内部结构。下面给出建造者模式的UML图,以建造小人为实例。

2.UML图

建造者模式一般应用于构建产品的步骤(也可以称为算法)不变,而每个步骤的具体实现又剧烈变化的情况。
对于客户来说,只需知道导向者就可以了,通过导向者,客户就能构造复杂的对象,而不需要知道具体的构造过程。下面给出小人例子的代码实现。

3.代码实现
#include <iostream>using namespace std;class Builder{public:virtual void BuildHead() = 0;virtual void BuildBody() = 0;virtual void BuildLeftArm() = 0;virtual void BuildRightArm() = 0;virtual void BuildLeftLeg() = 0;virtual void BuildRightLeg() = 0;};//构造瘦人class ThinBuilder : public Builder{public:void BuildHead() { cout<<"build thin body"<<endl; }void BuildBody() { cout<<"build thin head"<<endl; }void BuildLeftArm() { cout<<"build thin left arm"<<endl; }void BuildRightArm() { cout<<"build thin right arm"<<endl; }void BuildLeftLeg() { cout<<"build thin left leg"<<endl; }void BuildRightLeg() { cout<<"build thin right leg"<<endl; }};//构造胖人  class FatBuilder : public Builder{public:void BuildHead() { cout<<"build fat body"<<endl; }void BuildBody() { cout<<"build fat head"<<endl; }void BuildLeftArm() { cout<<"build fat left arm"<<endl; }void BuildRightArm() { cout<<"build fat right arm"<<endl; }void BuildLeftLeg() { cout<<"build fat left leg"<<endl; }void BuildRightLeg() { cout<<"build fat right leg"<<endl; }};//构造的指挥官class Director{public:Director(Builder* builder) : m_builder(builder) {}void Create() {m_builder->BuildHead();m_builder->BuildBody();m_builder->BuildLeftArm();m_builder->BuildRightArm();m_builder->BuildLeftLeg();m_builder->BuildRightLeg();}private:Builder*m_builder;};int main(){ThinBuilder* thin = new ThinBuilder();Director* director = new Director(thin);director->Create();delete thin;delete director;return 0;}

优点
1).隔离了构建的步骤和具体的实现,为产品的具体实现提供了灵活度。
2).封装和抽象了每个步骤的实现,实现了依赖倒转原则。
3).封装了具体的步骤,减少了代码的冗余。

缺点
要求构建产品的步骤(算法)是不能剧烈变化的,最好是不变的,这样就影响了灵活度。
0 0
原创粉丝点击