日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 編程 > C++ > 正文

C++設計模式之建造者模式

2020-05-23 14:21:31
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C++設計模式之建造者模式,一個復雜對象是由多個部件組成的,建造者模式是把復雜對象的創建和部件的創建分別開來,分別用Builder類和Director類來表示,需要的朋友可以參考下
 
 

建造者模式

在GOF的《設計模式 可復用面向對象軟件的基礎》中是這樣說的:將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。

這句話,似懂非懂的。一個復雜對象的創建,其通常是由很多的子對象構成;如果一個對象能夠直接就創建好了,那么也不會稱之為復雜對象。由于項目中需求的變化,這個復雜對象的各個部分經常會發生劇烈的變化,但是,不管怎么變化,將它們組合在一起,組成一個復雜的對象的事實是不會變的。建造者模式就提供了一種“封裝機制”來將各個對象的變化隔離開,最終,組合成復雜對象的過程是不會變的。

在《大話設計模式》一書中,例舉了一個很好的例子————建造小人。建造一個小人,要分為六步:頭部、身體、左手、右手、左腳和右腳。與抽象工廠模式不同的是,建造者模式是在Director的控制下一步一步的構造出來的,在建造的過程中,建造者模式可以進行更精細的控制。不管人的頭部、身體、左手、右手、左腳或者右腳如何變化,但是最終還是由這幾部分組合在一起形成一個人,雖然是同一個建造過程,但是這個人就會有不同的表示,比如,胖子,瘦子,個高的,個低的等等。

UML圖

類圖如下:

C++設計模式之建造者模式

時序圖如下:

C++設計模式之建造者模式

代碼實現

 

復制代碼代碼如下:

/*
** FileName     : BuilderPattern
** Author       : Jelly Young
** Date         : 2013/11/22
** Description  : More information, please go to http://www.conghuacea.com
*/
 
#include <iostream>
using namespace std;
 
typedef enum MANTYPETag
{
    kFatMan,
    kThinMan,
    kNormal
}MANTYPE;
 
class Man
{
public:
    void SetHead(MANTYPE type){ m_Type = type; }
    void SetBody(MANTYPE type){ m_Type = type; }
    void SetLeftHand(MANTYPE type){ m_Type = type; }
    void SetRightHand(MANTYPE type){ m_Type = type; }
    void SetLeftFoot(MANTYPE type){ m_Type = type; }
    void SetRightFoot(MANTYPE type){ m_Type = type; }
    void ShowMan()
    {
        switch (m_Type)
        {
        case kFatMan:
            cout<<"I'm a fat man"<<endl;
            return;
 
        case kThinMan:
            cout<<"I'm a thin man"<<endl;
            return;
 
        default:
            cout<<"I'm a normal man"<<endl;
            return;
        }
    }
 
private:
    MANTYPE m_Type;
};
 
// Builder
class Builder
{
public:
    virtual void BuildHead(){}
    virtual void BuildBody(){}
    virtual void BuildLeftHand(){}
    virtual void BuildRightHand(){}
    virtual void BuildLeftFoot(){}
    virtual void BuildRightFoot(){}
    virtual Man *GetMan(){ return NULL; }
};
 
// FatManBuilder
class FatManBuilder : public Builder
{
public:
    FatManBuilder(){ m_FatMan = new Man(); }
    void BuildHead(){ m_FatMan->SetHead(kFatMan); }
    void BuildBody(){ m_FatMan->SetBody(kFatMan); }
    void BuildLeftHand(){ m_FatMan->SetLeftHand(kFatMan); }
    void BuildRightHand(){ m_FatMan->SetRightHand(kFatMan); }
    void BuildLeftFoot(){ m_FatMan->SetLeftFoot(kFatMan); }
    void BuildRightFoot(){ m_FatMan->SetRightFoot(kFatMan); }
    Man *GetMan(){ return m_FatMan; }
 
private:
    Man *m_FatMan;
};
 
// ThisManBuilder
class ThinManBuilder : public Builder
{
public:
    ThinManBuilder(){ m_ThinMan = new Man(); }
    void BuildHead(){ m_ThinMan->SetHead(kThinMan); }
    void BuildBody(){ m_ThinMan->SetBody(kThinMan); }
    void BuildLeftHand(){ m_ThinMan->SetLeftHand(kThinMan); }
    void BuildRightHand(){ m_ThinMan->SetRightHand(kThinMan); }
    void BuildLeftFoot(){ m_ThinMan->SetLeftFoot(kThinMan); }
    void BuildRightFoot(){ m_ThinMan->SetRightFoot(kThinMan); }
    Man *GetMan(){ return m_ThinMan; }
 
private:
    Man *m_ThinMan;
};
 
// Director
class Director
{
public:
    Director(Builder *builder) { m_Builder = builder; }
    void CreateMan();
 
private:
    Builder *m_Builder;
};
 
void Director::CreateMan()
{
    m_Builder->BuildHead();
    m_Builder->BuildBody();
    m_Builder->BuildLeftHand();
    m_Builder->BuildRightHand();
    m_Builder->BuildLeftHand();
    m_Builder->BuildRightHand();
}
 
int main(int argc, char *argv[])
{
    Builder *builderObj = new FatManBuilder();
    Director directorObj(builderObj);
    directorObj.CreateMan();
    Man *manObj = builderObj->GetMan();
    if (manObj == NULL)
        return 0;
 
    manObj->ShowMan();
    delete builderObj;
    builderObj = NULL;
 
    return 0;
};

 

上面這個例子比較雜,但是也是建造者模式的應用。下面這個例子是建造者最一般,最簡單的實現方法:

 

復制代碼代碼如下:

/*
** FileName     : BuilderPattern
** Author       : Jelly Young
** Date         : 2013/11/23
** Description  : More information, please go to http://www.conghuacea.com
*/
 
#include <iostream>
#include <vector>
using namespace std;
 
class Builder;
 
// Product
class Product
{
public:
    void AddPart(const char *info) { m_PartInfoVec.push_back(info); }
    void ShowProduct()
    {
        for (std::vector<const char *>::iterator item = m_PartInfoVec.begin(); 
            item != m_PartInfoVec.end(); ++item)
        {
            cout<<*item<<endl;
        }
    }
 
private:
    std::vector<const char *> m_PartInfoVec;
};
 
// Builder
class Builder
{
public:
    virtual void BuildPartA() {}
    virtual void BuildPartB() {}
    virtual Product *GetProduct() { return NULL; }
};
 
// ConcreteBuilder
class ConcreteBuilder : public Builder
{
public:
    ConcreteBuilder() { m_Product = new Product(); }
    void BuildPartA()
    {
        m_Product->AddPart("PartA completed");
    }
 
    void BuildPartB()
    {
        m_Product->AddPart("PartB completed");
    }
 
    Product *GetProduct() { return m_Product; }
 
private:
    Product *m_Product;
};
 
// Director
class Director
{
public:
    Director(Builder *builder) { m_Builder = builder; }
    void CreateProduct()
    {
        m_Builder->BuildPartA();
        m_Builder->BuildPartB();
    }
 
private:
    Builder *m_Builder;
};
 
// main
int main()
{
    Builder *builderObj = new ConcreteBuilder();
    Director directorObj(builderObj);
    directorObj.CreateProduct();
    Product *productObj = builderObj->GetProduct();
    if (productObj == NULL)
    {
        return 0;
    }
    productObj->ShowProduct();
    delete builderObj;
    builderObj = NULL;
}

 

通過比較上面的兩個例子,可以很容易的把建造者模式的骨架抽象出來。

使用要點

1.建造者模式生成的對象有復雜的內部結構,將分步驟的去構建一個復雜的對象,分多少步是確定的,而每一步的實現是不同的,可能經常發生變化;

2.在上面的例子中,我們都看到了最終生成的Man和Product都沒有抽象類,這又導出建造者適用的一種情況,當需要創建復雜對象的過程中,復雜對象沒有多少共同的特點,很難抽象出來時,而復雜對象的組裝又有一定的相似點時,建造者模式就可以發揮出作用。簡單的說,可能使用了建造者模式,最終建造的對象可能沒有多大的關系,關于這一點,閱讀《設計模式 可復用面向對象軟件的基礎》中的建造者模式時是最有體會的。

總結

一個復雜對象是由多個部件組成的,建造者模式是把復雜對象的創建和部件的創建分別開來,分別用Builder類和Director類來表示。用Director構建最后的復雜對象,而在上面Builder接口中封裝的是如何創建一個個部件(復雜對象是由這些部件組成的),也就是說,Director負責如何將部件最后組裝成產品。這樣建造者模式就讓設計和實現解耦了。

剛開始接觸建造者模式的時候,最容易把建造者和抽象工廠模式混淆了。由于而這都屬于創建型的設計模式,所以二者之間是有公共點的,但是建造者模式注重于對象組合,即不同的小對象組成一個整體的復雜大對象,而抽象工廠模式針對于接口編程,只是對外提供創建對象的工廠接口,不負責對象之后的處理。

建造者模式,是一個比較復雜,不容易權衡的設計模式。大家應該更多的閱讀開源代碼,理解他人是如何使用該模式的。從實際的應用中學習設計模式。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
欧美一级一级性生活免费录像| 不卡av免费在线| 国产日产一区二区| 午夜国产视频 | 国产一区不卡精品| 日韩三级免费观看| 韩国v欧美v日本v亚洲| 亚洲高清中文字幕| 欧美日韩在线播放一区| 国产三级视频在线| 天堂在线视频中文网| 免费视频国产一区| 久久精品不卡| 一区二区在线视频播放| 91精品国产高清91久久久久久| av免费观看网站| 精品人妻一区二区免费视频 | 91精品在线观看视频| 日韩欧美在线不卡| 中文字幕在线精品| 一区二区在线高清视频| 欧美不卡123| 91精品久久久久久久91蜜桃| 欧美 日韩 国产 高清| 免费视频中文字幕| 亚洲人线精品午夜| 亚洲免费观看视频| 日韩精品在线免费观看| 欧美久久一二三四区| 欧美日韩精品中文字幕| 国产高清一级片| 欧美日韩中文字幕精品| 精品在线一区二区| 九七久久人人| 欧美日本精品在线| 欧美久久在线| 中文字幕欧美在线| 日韩精品丝袜在线| 国产三级精品网站| 欧洲精品二区| 亚洲 欧美综合在线网络| 亚洲高清在线免费| 不卡一二三区| 精品在线网站观看| 在线综合 亚洲 欧美中文字幕| 欧美日韩免费高清| www.狠狠干| 在线看av的网址| 亚洲第一视频在线观看| av免费观看国产| 亚洲综合在线小说| 99在线国产| 日韩精品久久久| 日韩欧美中文字幕视频| 久久精品一二三| 免费在线播放av| 伊人www22综合色| 欧美日韩精品在线播放| 国产日韩第一页v| 中文字幕在线视频第一页| 欧美日韩国产中文精品字幕自在自线| 日韩精品在线播放| 亚洲欧美中文字幕| 二区三区中文字幕| 欧美日韩中文精品| 日韩视频精品在线| 欧美日韩精品免费在线观看视频| 91精品久久久久久久久久入口| 久久香蕉一区| www日韩在线观看| 亚洲一区在线观看网站| 国产亚洲视频中文字幕视频| 日韩欧美色综合网站| 亚洲欧美日本另类| 日本亚洲视频在线| 精品网站999www| 午夜影院在线观看欧美| 日韩高清不卡一区| 精品三级av| 日韩中文字幕二区| 日韩欧美在线第一页| 欧美日韩亚洲天堂| 伊人永久在线| 日韩精品不卡一区二区| 精品视频1区2区3区| 国产在线观看黄色| 91精品国产91| 欧美亚洲国产日韩2020| 一区二区视频在线| 一区二区三区四区五区视频在线观看| 91精品国产自产91精品| 日韩不卡高清视频| 伊人网站在线| 国产精久久久久| 在线国产91| 最近中文av字幕在线中文 | 日韩在线一区二区| 91精品国产综合久久香蕉最新版| 日韩中文字幕在线视频观看| www.久久草| 亚洲乱码中文字幕综合| 久久婷婷中文字幕| 欧美变态tickling挠脚心| 欧美国产日韩在线播放| 欧美日韩在线不卡| 欧美日韩国产首页在线观看| 天天综合色天天| 欧美日韩高清不卡| 999精品色在线播放| 在线看av的网址| 日韩久久久精品| 日韩中文字幕在线视频观看| 亚洲欧洲日韩精品在线| 国产中文在线视频| 免费日韩精品中文字幕视频在线| 日韩欧美亚洲国产| 欧美日韩视频免费播放| 日韩高清在线不卡| 97国产视频| 久久久精品福利| 国产丝袜一区| 亚洲大片精品永久免费| 亚洲视频一二三四| 一级特黄大欧美久久久| 国产欧美自拍一区| 国产网站av| 午夜成人鲁丝片午夜精品| 国产导航在线| 91久久精品视频| 国产在线www| 精品视频在线视频| 国产网站av| 国产日韩免费| 日韩欧美亚洲国产一区| 亚洲深夜福利| 91精品999| 国内精品露脸在线视频播放| 国产无套粉嫩白浆在线2022年| 亚洲小说春色综合另类电影| 国产手机视频一区二区| 欧美日韩综合不卡| 一区二区精品| 91精品在线视频观看| 最近中文字幕日韩精品| 国产福利久久久| 日韩欧美在线中文字幕| 免费国产成人看片在线| 中文字幕国产在线| 免费国产成人看片在线| 欧美 日韩 国产在线| 午夜亚洲一区| 国产欧美日韩精品综合| 亚洲校园欧美国产另类| 欧美日韩精品在线播放| 国产欧美日韩91| 日韩精品在线免费观看| 亚洲а∨精品天堂在线| 欧美日韩国产观看视频| 日韩欧美中文| 国产成人精品免费网站| 91麻豆精品在线| 欧美日韩一级视频| 亚洲丝袜一区| 欧美日韩在线视频免费观看| 精品三区视频| 成人a在线观看| 在线视频第一页| 国产区高清在线| 成年人黄国产| 中文在线一区| a天堂在线资源| 国产激情在线视频| 日韩精品在线播放| 激情婷婷亚洲| 精品国产1区2区3区| 欧美二区在线观看| 国产1区在线| av首页在线| 国产日韩在线视频| 久久精品国产2020观看福利| 高清不卡一区二区| 欧美日韩综合在线| 精品婷婷伊人一区三区三| www在线播放| 亚洲高清中文字幕| 国产一区在线精品| 国产高清不卡av| 一区二区在线观| 天天综合天天| 日韩久久在线| 国产欧美日韩在线| 快she精品国产999| 欧美日韩精品免费看| 在线黄色国产电影| 国产在线不卡一区| 国产91大片| 精品三级在线| www.久久草| 亚洲一区日韩在线| 在线视频一区二区三区在线播放 | 日韩国产在线不卡视频| 亚洲一区在线观看视频| 日韩视频专区| 中文字幕在线视频网| 久久夜色精品国产噜噜亚洲av| 欧美日韩在线视频免费观看| 日韩免费精品| a√免费观看在线网址www| 91精品国产色综合久久不卡蜜臀| 精品一二线国产| 一级免费a一片| 黄色一区二区视频| 欧美日韩精品综合| 色妇色综合久久夜夜| 1区2区在线| 亚洲一二三不卡| 91精品免费看| 国产黄在线观看| 亚洲欧洲日产国码av系列天堂 | 日韩色在线观看| 一区二区视频国产| 日韩三级视频中文字幕| 成人xxxx| 精品不卡一区二区| 日韩在线观看a| 日韩欧美一级二级三级久久久| 日韩精品一区二区三区视频播放| 国产黄在线观看| 午夜成人鲁丝片午夜精品| 亚洲一区在线观看免费| 亚洲视频中文字幕| 久久精品久久久久| 国产91大片| 国产欧美日韩综合| 精品国产网站在线观看| 国产黄色小视频| 日韩国产专区| 欧美日韩国产一中文字不卡| 日韩免费看网站| 精品在线一区二区三区| 欧美日韩精品是欧美日韩精品| 久久人人精品| 亚洲综合在线中文字幕| 国产欧亚日韩视频| 欧美日韩在线播放视频| www.老鸭窝.com| 欧美日韩精品综合| 91精品国产99| 国产一卡2卡3卡四卡网站| 国产三级视频在线| 欧美日韩综合在线| 欧美一级在线免费| 日韩精品在线免费播放| 一区二区高清在线| 91精品国产网站| 色猫猫国产区一区二在线视频 | 日韩欧美国产成人精品免费| 中文字幕在线视频久| 中文 欧美 日韩| 精品久久久三级| 欧美日韩激情一区| 国产欧美日韩精品在线| 欧美日韩一级黄| 日韩欧美国产高清| 日韩美女中文字幕| 日韩.com| 欧美日韩精品久久久| 国产欧美日韩在线| 欧美日韩国产综合视频在线观看| xxxxx性| 日本精品专区| 国产成人精品999| 久久99精品久久久久婷婷| 国产日韩电影| 亚洲 欧美 日韩系列| 91精品免费看| 日韩视频专区| 欧美日韩国产综合久久| 在线不卡日本| 麻豆精品视频入口| 日韩在线观看视频一区| 国产免费不卡av| 麻豆精品视频入口| 中文字幕2020第一页| 亚洲三级av| 日韩欧美国产高清| 欧美日韩一级黄| 精品欧美日韩在线| 亚洲娇小xxxx欧美娇小| 久久精品一级爱片| 成人一区二区不卡免费| 国产一区在线不卡| 一二三区精品视频| 国产午夜精品视频| 91精品国产综合久久香蕉的特点| 99色在线视频| 欧美亚洲免费高清在线观看| 精品久久在线| 日韩三级视频在线播放| 国产一级在线免费观看| 亚洲一区在线观看网站| 亚洲v中文字幕| av不卡免费看| 国产成人精品免费在线| 一区二区视频国产| 日韩视频精品在线观看| 一级免费a一片| 中文在线中文字幕| 精品国产不卡一区二区| 91精品国产综合久久香蕉最新版| 刘玥91精选国产在线观看| 天堂在线视频中文网| 阿v免费在线观看| 中文字幕不卡三区| 日韩欧美一级二级三级久久久| 欧美日韩中文另类| 欧美黄页在线免费观看| 国产一区日韩欧美| 久久蜜桃精品| 国产欧美日韩在线看| 欧美日韩精品电影| 国产激情在线| 亚洲成人7777| 日韩一级中文字幕| 欧美日韩国产不卡| 日韩区欧美区| 亚洲免费精品视频| 91精品国产91久久久久久久久| 欧美在线视频一区二区| 国产福利免费在线观看| 欧美中文字幕在线观看视频| 欧美99久久| 亚洲欧美999| 最新中文字幕在线播放| 国产欧美日韩精品在线观看| 亚洲综合日韩欧美| 日韩视频在线一区二区| 在线欧美一级视频| 欧美二区在线观看| 日韩欧美国产1| 一区三区二区视频| 亚洲社区在线| 在线视频不卡国产V| 黄色资源在线观看| 丰满少妇一区二区| 日韩免费视频一区二区| 九一精品国产| www中文字幕在线观看| 精品国内自产拍在线视频| 自拍日韩亚洲一区在线| www.精品视频| 最近中文字幕在线中文视频| 国产日韩av一区二区| 国产自产视频| 中文字幕 亚洲视频| 成年人黄国产| 极品久久久久久| 欧美性极品xxxx做受| 亚洲视频一二三四| 亚洲视频在线观看日本a| 日韩在线观看精品| 91欧美日韩麻豆精品| 亚洲综合中文字幕在线| 亚洲一二三不卡| 精品国产欧美日韩不卡在线观看 | 91精品国产91综合久久蜜臀| 日韩中文在线中文网三级| 精品一区二区在线观看视频| 一区二区三区免费看视频| 91精品国产综合久久蜜臀 | 久久久91精品国产| 日韩久久精品网| 欧美不卡一二三| 最新中文字幕在线| 97视频在线| 欧美日韩午夜在线视频| 久久久精品99| www高清在线视频日韩欧美| 日韩视频在线一区| 国产日韩精品在线| 中文字幕国产日韩| 日韩专区中文字幕| www..com日韩| 日韩不卡一二区| 久久精品黄色片| 精品日韩欧美| 日韩欧美在线中文字幕| 91精品国产自产观看在线| 欧美亚洲免费高清在线观看| 日韩精品在线第一页| 国产成人综合精品| 国产日韩1区| 欧美日韩亚洲一区| 国产在线拍偷自揄拍精品| 亚洲开心激情| 欧美日韩国产免费| 久久手机免费观看| 欧洲精品久久久| 在线欧美日韩国产| 欧美日韩国产高清|