建造者模式(Builder Pattern)使用多个简单的对象一步步构建另一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
意图
将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
解决问题
主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定
如何解决
将变与不变分离
优点
1.建造者独立,易扩展。 2. 便于控制细节风险
缺点
1.产品必须有共同点,范围有限制
2.如内部变化复杂,会有很多的建造类
注意事项
与工厂模式区别的是:建造者模式更加关注与零件装配的顺序
C++实现
《大话设计模式》举了一个很好的例子——建造小人,一共需建造6个部分,头部、身体、左右手、左右脚。与工厂模式不同,建造者模式是在导向者的控制下一步一步构造产品的。建造小人就是在控制下一步步构造出来的。创建者模式可以能更精细的控制构建过程,从而能更精细的控制所得产品的内部结构。
下面给出UML图:
建造者模式
class Builder
{
public:
virtual void BuildHead() {}
virtual void BuildBody() {}
virtual void BuildLeftArm(){}
virtual void BuildRightArm() {}
virtual void BuildLeftLeg() {}
virtual void BuildRightLeg() {}
};
//构建瘦人
class ThinBuilder : public Builder
{
public:
void BuildHead() { cout << "build thin body" << endl; }
void BuildBody() { cout << "build thin head" << endl; }
void BuildLeftArm() { cout << "build thin leftarm" << endl; }
void BuildRightArm() { cout << "build thin rightarm" << endl; }
void BuildLeftLeg() { cout << "build thin leftleg" << endl; }
void BuildRightLeg() { cout << "build thin rightleg" << 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 leftarm" << endl; }
void BuildRightArm() { cout << "build fat rightarm" << endl; }
void BuildLeftLeg() { cout << "build fat leftleg" << endl; }
void BuildRightLeg() { cout << "build fat rightleg" << endl; }
};
//构建指挥官
class Director
{
private:
Builder* m_pBuilder;
public:
Director(Builder *builder)
{
m_pBuilder = builder;
}
void Create()
{
m_pBuilder->BuildHead();
m_pBuilder->BuildBody();
m_pBuilder->BuildLeftArm();
m_pBuilder->BuildRightArm();
m_pBuilder->BuildLeftLeg();
m_pBuilder->BuildRightLeg();
}
};
测试:
int test_Builder()
{
FatBuilder fat;
Director dir(&fat);
dir.Create();
system("pause");
return 0;
}