介紹
例如建造小人,一共需建造6個部分,頭部、身體、左右手、左右腳。與工廠模式不同,建造者模式是在導向者的控制下(傳入參數)一步一步構造出不同的産品(但是内部建造順序都是穩定的)。當我們要建立的對象很複雜的時候(通常是由很多其他的對象組合而成),我們要複雜對象的建立過程和這個對象的表示(展示)分離開來,這樣做的好處就是通過一步步的進行複雜對象的建構, 由于在每一步的構造過程中
可以引入參數,使得經過相同的步驟建立最後得到的對象的展示不一樣。這就是建造者模式。
實作
/*
純虛函數,定義接口
*/
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; }
};
/*
* 構造胖人,和瘦人步驟一樣,但是内容不同,防止客戶程式調用複雜或者過程丢失。直接
* 建立一個director執行相同的構造過程。
*/
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 main(void){
//Singleton *s1 = Singleton::GetInstance();
//Singleton *s2 = Singleton::GetInstance();//靜态可以直接擷取,系統最後會自動調用析構函數
ThinBuilder thinperson;//聲明類
FatBuilder fatperson;//聲明類
Director(&thinperson).Create();//利用多态将多個調用簡化了到create中
Director(&fatperson).Create();//将多個調用簡化了
return ;
}
模式在于簡化相同數量函數的調用。