1. 建造者模式的由來
在構建一個複雜對象的時候,經常會有這種情況:該對象是由各個部分的子對象按照一定的步驟或者算法構成。這些子對象也許會經常變化,但它們組合的方式卻不變。
以建造小人爲例,儘管建造出的小人各不相同,有大有小,有高有低,但都是按照一個流程進行的。頭-》身體-》左右手-》左右腳。建造者模式與此類似,在嚮導的指導下一步一步完成產品的建造。
2. 類圖表示
3. 實現示例代碼
//建造者模式
#include <iostream>
#include <string>
using namespace std;
//產品類
class Product
{
private:
string partA; //產品的組件A
string partB; //組件B
public:
Product(){}
//添加組件A
void addPartA(string pa)
{
this->partA=pa;
}
//添加組件B
void addPartB(string pb)
{
this->partB=pb;
}
//顯示產品
void show()
{
cout<<"PartA:"<<partA<<endl;
cout<<"PartB: "<<partB<<endl;
}
};
//Builder接口
class Builder
{
public:
virtual void buildPartA()=0;//組裝A組件
virtual void buildPartB()=0;//組裝B組件
virtual Product* getProduct()=0;//返回產品
};
//產品1的Builder,實現Builder接口
class Builder1:public Builder
{
private:
//包含一個產品對象(數據成員)
Product *pro;
public:
Builder1()
{
pro=new Product;
}
void buildPartA()
{
pro->addPartA("產品1的A組件");
}
void buildPartB()
{
pro->addPartB("產品1的B組件");
}
Product* getProduct()
{
return pro;
}
};
//產品2的Builder,實現Builder接口
class Builder2:public Builder
{
private:
//包含一個產品對象(數據成員)
Product *pro;
public:
Builder2()
{
pro=new Product;
}
void buildPartA()
{
pro->addPartA("產品2的A組件");
}
void buildPartB()
{
pro->addPartB("產品2的B組件");
}
Product* getProduct()
{
return pro;
}
};
//指揮者,負責指揮產品的組建
class Director
{
public:
void construct(Builder* bu)
{
bu->buildPartA();
bu->buildPartB();
}
};
int main()
{
//創建一個指揮者
Director dir;
Builder1* bu1=new Builder1;
dir.construct(bu1);
Product* pro1=bu1->getProduct();
pro1->show();
return 0;
}