建造者模式 c++

建造者模式
定義: 也叫生成器模式,將一個複雜的對象的構建與他的表示分離,使得同樣的構建過程可以創建不同的表示。
如果有多個產品類就有幾個具體的建造者,而且這多個產品類具有相同的接口或抽象類。
導演類起到封裝作用,當建造者模式比較大時,導演類可以有多個。
類圖:
這裏寫圖片描述
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;
}
結果:
奔馳車跑起來是這個聲音
奔馳車應該是這樣停車的
奔馳車跑起來是這個聲音
奔馳車應該是這樣停車的
寶馬車的喇叭聲是這樣的
寶馬車跑起來是這個聲音
寶馬車應該是這樣停車的
寶馬車的喇叭聲是這樣的
寶馬車跑起來是這個聲音
寶馬車應該是這樣停車的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章