建造者模式也属于创建型模式,定义为:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种对象创建型模式。客户端在使用时,只需要指定复杂对象的类型,无需知道构建细节,就可以生成一个复杂的对象,UML图:
UML图中的角色介绍
Bulider:抽象创建角色,包含两类抽象方法,bulidX(创建对象的组成部分),getresult(返回创建好的对象),由具体的建造者继承后实现。
ConcreteBulider:具体的创建者,继承自Builder,实现抽象方法,明确自己要创建的对象,创建该产品的内部表示并定义它的装配过程。
Director:指挥者,和客户端进行交互,它包含建造者成员,提供建造函数调用建造者对象的部件构造方法,完成对象的组建。
Product:产品角色,最终生成的产品对象,它是一个复杂对象,包含多个成员属性。
代码体现:
//抽象创建角色
class Bulider
{
public:
Product product;
virtual void BulidA()=0;
virtual void BulidB()=0;
virtual void BulidC()=0;
Product* getresult()
{
return product;
}
};
//具体创建者
class ConcreteBulider
{
public:
void BulidA()
{
std::string a = "苗条";
product.setA(a);
cout<<"制作了角色身材"<<endl;
}
void BulidB()
{
product.setB("温柔");
cout<<"制作了角色长相"<<endl;
}
void BuildC()
{
product.setC("齐胸襦裙");
cout<<"制作了角色服装"<<endl
}
};
//指挥者
class Director
{
public:
Director()
{}
~Director()
{}
void setBulider(Bulider* build)
{
bulider=bulid;
}
Product* construct()
{
bulider->bulidA();
bulider->bulidB();
builder->bulidC();
return builder->getresult();
}
pirvete:
Bulider* bulider;
}
//产品
class Product
{
public:
void setA(std::string a)
{
A = a;
cout << "设置角色身材为a"<<endl;
}
//剩下的set和get不写了...
void show()
{
cout<<"我是被创建出来的游戏角色"<<endl;
}
private:
std::string A;
std::string B;
std::string C;
};
//客户端的使用
int main()
{
Bulider* bulider = new ConcreteBulider();
Direct direct;
direct.setBulider(bulider);
Product* pro = direct->construct();
pro->show();
return 0;
}
以上代码简单创建出了一个游戏角色,创建者模型是比较适用于这种对象由多个部分组成的场景下的。下面分析优缺点和适用场景。
优点:
1.客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
2.每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。由于指挥者类针对抽象建造者编程,增加新的具体建造者无须修改原有类库的代码,系统扩展方便,符合“开闭原则”。
3.可以更加精细地控制产品的创建过程。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。
缺点:
1.适用范围有一定限制,所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,例如很多组成部分都不相同,不适合使用建造者模式
2.如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,增加系统的理解难度和运行成本。
适用场景:
1.被创建对象内部有复杂的内部结构,包含多个成员属性(这些属性需要按照一定顺序被创建)
2. 对象的创建过程独立于创建该对象的类。在建造者模式中通过引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类和客户类中。
3. 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。
模式扩展:
如果系统中只需要一个具体建造者的话,可以省略抽象建造者,省略抽象建造者之后,也可省略指挥者,具体建造者扮演指挥者与建造者双重角色。