一,简介
建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
二,角色
builder
为创建一个Product对象的各个部件指定的抽象接口
ConcreteBuilder
具体建造者,实现builder接口,构造和装配各个部件
Director
指挥者,是构建一个使用builder接口的对象
三,举例
构建瘦小人和胖小人
1,类图
2,代码
//1 为创建一个Product对象的各个部件指定的抽象接口
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;
};
//2 具体建造者 实现builder接口
//构造瘦人
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; }
};
//3 构建一个使用builder接口的对象 ,管理建造出来的实例的依赖关系
class Director {
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();
}
private:
Builder* m_pBuilder;
};
int main()
{
FatBuilder fat;
Director director(&fat);
director.Create();
system("pause");
return 0;
}
四,优缺点
优点: 1、建造者独立,易扩展。 2、便于控制细节风险。
缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。
五,使用场景
1、需要生成的对象具有复杂的内部结构。
2、需要生成的对象内部属性本身相互依赖。
如:去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。
注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。