建造者模式
定義: 也叫生成器模式,將一個複雜的對象的構建與他的表示分離,使得同樣的構建過程可以創建不同的表示。
如果有多個產品類就有幾個具體的建造者,而且這多個產品類具有相同的接口或抽象類。
導演類起到封裝作用,當建造者模式比較大時,導演類可以有多個。
類圖:
Product產品類:
通常實現了模板方法模式,也就是有模板方法和基本方法.
Builder抽象建造者:
規範產品的組建,一般由子類實現。
ConcreteBulider具體建造者:
實現抽象類的定義的所有方法,並返回一個組建好的對象。
Director 指導類:
負責安排已有模塊的順序,然後調用Bulider開始建造。
建造者優點:
1).客戶端不必知道內部實現
2).建造者獨立,容易擴展
3).具體見到這是獨立的,可以對建造過程逐步細化,而不對其他模塊產生影響。
使用場景:
1).相同方法,不同執行順序,產生不同的事件結果。
2).多個部件或零件,都可以裝配到一個對象中,但是產生的運行結果又不相同
3).產品類非常複雜,或者產品類的調用順序不同產生不同的效能
4).對象使用過程中會使用到系統中的其他對象
建造者模式擴展:
對建造者模式引入模板方法模式
建造者模式與工廠模式:
建造者模式 工廠模式
主要注重調用基本方法的順序安排,也就是基本方法實現了,也就是零件的裝配,順序不同產生的對象也不同,(順序不同產生對象不同) 主要重點是創建,創建零件是他的職責,組裝順序不關心
題示:
寶馬車奔馳車模型用戶隨時可能要求更改 指導類只製造了四個模型
代碼:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
typedef vector<string> ArrayList;
//車輛模型抽象類
class CarModel
{
private:
ArrayList sequence = ArrayList();
protected:
virtual void start() = 0;
virtual void stop() = 0;
virtual void alarm() = 0;
virtual void engineBoom() = 0;
public :
virtual void run() final
{
for(unsigned int i = 0 ; i <sequence.size(); i++)
{
string actionName = sequence[i];
if(actionName == "start")
this->start();
if(actionName == "stop")
this->stop();
if(actionName == "alarm")
this->alarm();
if(actionName == "engine Boom")
this->engineBoom();
}
}
public:
virtual void setSequence(ArrayList sequence) final
{
this->sequence = sequence;
}
};
//奔馳模型
class BenzModel:public CarModel
{
protected:
void alarm()
{
cout<<"奔馳車的喇叭聲是這樣的"<<endl;
}
void engineBoom()
{
cout<<"奔馳車的引擎是這個聲音"<<endl;
}
void start()
{
cout<<"奔馳車跑起來是這個聲音"<<endl;
}
void stop()
{
cout<<"奔馳車應該是這樣停車的"<<endl;
}
};
//寶馬模型
class BMWModel:public CarModel
{
protected:
void alarm()
{
cout<<"寶馬車的喇叭聲是這樣的"<<endl;
}
void engineBoom()
{
cout<<"寶馬車的引擎是這個聲音"<<endl;
}
void start()
{
cout<<"寶馬車跑起來是這個聲音"<<endl;
}
void stop()
{
cout<<"寶馬車應該是這樣停車的"<<endl;
}
};
//抽象汽車組裝者
class CarBuilder
{
public:
virtual void setSequence(ArrayList sequence) = 0;//建造模型 要給組裝順序
virtual CarModel* getCarModel() = 0 ;//順序設置完畢,就可以拿到這個車輛模型
};
//奔馳組裝者
class BenzBuilder : public CarBuilder
{
private:
BenzModel benz = BenzModel();
public:
CarModel* getCarModel()
{
return &(this->benz);
}
void setSequence(ArrayList sequence)
{
this->benz.setSequence(sequence);
}
};
//寶馬組裝者
class BMWBuilder : public CarBuilder
{
private:
BMWModel bmw = BMWModel();
public:
CarModel* getCarModel()
{
return &(this->bmw);
}
void setSequence(ArrayList sequence)
{
this->bmw.setSequence(sequence);
}
};
//導演類 只製造了4個模型
class Director
{
private :
ArrayList sequence = ArrayList();
BenzBuilder benzbuilder = BenzBuilder();
BMWBuilder bmwbuilder = BMWBuilder();
/*四個模型*/
public:
BenzModel getABenzModel()
{
/*清理現場*/
this->sequence.clear();
this->sequence.push_back("start");
this->sequence.push_back("stop");
this->benzbuilder.setSequence(this->sequence);
CarModel * car(this->benzbuilder.getCarModel());
return *(dynamic_cast<BenzModel*>(car));
}
BenzModel getBBenzModel()
{
/*清理現場*/
this->sequence.clear();
this->sequence.push_back("engine boom");
this->sequence.push_back("start");
this->sequence.push_back("stop");
this->benzbuilder.setSequence(this->sequence);
CarModel * car(this->benzbuilder.getCarModel());
return *(dynamic_cast<BenzModel*>(car));
}
BMWModel getCBMWModel()
{
/*清理現場*/
this->sequence.clear();
this->sequence.push_back("alarm");
this->sequence.push_back("start");
this->sequence.push_back("stop");
this->bmwbuilder.setSequence(this->sequence);
CarModel * car(this->bmwbuilder.getCarModel());
return *(dynamic_cast<BMWModel*>(car));
}
BMWModel getDBMWModel()
{
/*清理現場*/
this->sequence.clear();
this->sequence.push_back("alarm");
this->sequence.push_back("start");
this->bmwbuilder.setSequence(this->sequence);
CarModel * car(this->bmwbuilder.getCarModel());
return *(dynamic_cast<BMWModel*>(car));
}
};
int main()
{
Director dircetor = Director();
//2倆A類型奔馳車
for(int i = 0 ; i < 2 ; i++)
{
dircetor.getABenzModel().run();
}
for(int i = 0 ; i < 2 ; i++)
{
dircetor.getCBMWModel().run();
}
return 0;
return 0;
}
結果:
奔馳車跑起來是這個聲音
奔馳車應該是這樣停車的
奔馳車跑起來是這個聲音
奔馳車應該是這樣停車的
寶馬車的喇叭聲是這樣的
寶馬車跑起來是這個聲音
寶馬車應該是這樣停車的
寶馬車的喇叭聲是這樣的
寶馬車跑起來是這個聲音
寶馬車應該是這樣停車的