日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

23种设计模式C++源码与UML实现--建造者模式

發布時間:2025/3/15 c/c++ 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 23种设计模式C++源码与UML实现--建造者模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

建造者模式

代碼倉庫地址:建造者模式

Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23種設計模式中的一種。Builder模式是一種對象創建模式之一,用來隱藏復合對象的創建過程。他把復合對象的創建過程加以抽象,通過子類繼承和重載的方式,動態地創建具有復合屬性的對象。

對象的創建:Builder模式是為了對象的創建而設計的模式-創建的是一個復合對象,被創建的對象為一個具有復合屬性的復合對象,關注對象創建的各個部分的創建過程,不同工廠(Builder)對產品屬性有不同的創建方法。

  • Builder:為創建產品各個部分,統一抽象接口
  • ConcreteBuilder: 具體的創建產品的各個部分,部分A,部分B,部分C
  • Director: 構造一個使用Builder接口的對象
  • Product:表示被構造的復雜對象

ConcreteBuilder創建該產品的內部表示并定義它的裝配過程,包含定義組成部分的類,包含將這些部件裝配成最終產品的接口。

適用情況:

? 一個對象的構建比較復雜,將一個對象的構建和對象的表示進行分離。

說白了:建造者模式,其實就是相當于一個設計師,指揮建造師造房子,建造師可能是不同的,因為每個建造師建造水平和會造的房子都是不一樣的。

創建者模式和工廠模式的對比

Factory模式中:

  • 有一個抽象的工廠
  • 實現一個具體的工廠 - 汽車工廠
  • 工廠生產的汽車A,得到汽車產品A
  • 工廠生產汽車B,得到汽車產品B
  • 實現了購買者和生產線的隔離,強調的是結果

    Builder模式

  • 引擎工廠生產引擎產品,得到汽車的部件A
  • 輪胎工廠生產輪子產品,得到汽車部件B
  • 底盤工廠生產車身產品,得到汽車部件C
  • 將這些部件放到一起,形成剛好能夠組裝成一輛汽車的整體
  • 這樣做,目的是為了實現復雜對象生產線和其部件的解耦。強調的是過程

    兩者的區別在于以下幾種情況:

    工廠模式不考慮對象的組裝過程,而直接生成一個我想要的對象。

    Builder模式先一個個的創建對象的每一個部件,再統一組裝成一個對象

    工廠模式所解決的問題是,工廠生產產品

    而Builder模式解決的是工廠控制產品 生成器組裝各個部件的過程,然后從產品生成器中得到產品。

    前期問題的拋出-需要建造者模式的原因

    #include <iostream> #include <string> using namespace std;class House { public:void setDoor(string door){this->m_door = door;}void setWall(string wall){this->m_wall = wall;}void setWindow(string window){this->m_window = window;}string getDoor(void){cout << m_door << endl;return m_door;}string getWall(void){cout << m_wall << endl;return m_wall;}string getWindow(void){cout << m_window << endl;;return m_window;}private:string m_door;string m_wall;string m_window; };class Builder { public:Builder(void){m_house = new House;}~Builder(void){delete m_house;}void MakeBuilder(void){BuildDoor(m_house);BuildWall(m_house);BuildWindow(m_house);}void BuildDoor(House *h){h->setDoor("door");}void BuildWall(House *h){h->setWall("wall");}void BuildWindow(House *h){h->setWindow("window");}House *GetHouse(void){return m_house;}private:House *m_house; };int main(int argc, char const *argv[]) {// 不需要建造者,客戶直接造房子// 門窗 墻體玻璃等都需要用戶管理House *house = new House;house->setDoor("user door");house->setWall("user Wall");house->setWindow("big window");house->getDoor();house->getWall();house->getWindow();delete house;// 華麗的分割線cout << "=========================" << endl;// 請工程隊 建造房子// 將建造過程交給工程隊, 是不是還可以請個指揮建造的? 這樣客戶就能完全解放出來了Builder *builder = new Builder;builder->MakeBuilder();house = builder->GetHouse();house->getDoor();house->getWall();house->getWindow();delete builder;cout << "builder pattern." << endl;return 0; }

    兩者,雖然都建造好了房子,但是建筑隊參加之后,客戶就不需要參與房子的建造的每個過程了,將建造過程與使用者之間進行分離,這就是建造者模式想要達到的效果

    andrew@andrew-G3-3590:/work/linux-sys/DesignPatterns/cpp/build$ ./builder_pattern_question user door use Wall big window ========================= door wall window builder pattern.

    那除了這樣其實可以再請一個指揮者過來,因為實際中會有不同的建造者參與競爭,每個建造者精通的地方都是不一樣的,指揮者參與之后,用戶只需要把自己的需求告知指揮者就行。

    • 建造者模式,就是通過虛工程對基類,實現通過指揮者,指揮不同的建筑隊建設不同的房子
    #include <iostream> #include <string> using namespace std;// 建造者模式,就是通過虛工程對基類,實現 // 通過指揮者,指揮不同的建筑隊建設不同的房子class House { public:void setDoor(string door){this->m_door = door;}void setWall(string wall){this->m_wall = wall;}void setWindow(string window){this->m_window = window;}string getDoor(void){cout << m_door << endl;return m_door;}string getWall(void){cout << m_wall << endl;return m_wall;}string getWindow(void){cout << m_window << endl;;return m_window;}private:string m_door;string m_wall;string m_window; };class Builder { public:virtual void BuildWall(void) = 0;virtual void BuildDoor(void) = 0;virtual void BuildWindow(void) = 0;virtual House* GetHouse(void) = 0; public:virtual ~Builder(void){} };//公寓建筑工程隊 class FlatBuilder : public Builder { public:FlatBuilder(){m_house = new House;}virtual void BuildWall(void){m_house->setWall("flat wall");}virtual void BuildDoor(void){m_house->setDoor("flat door");}virtual void BuildWindow(void){m_house->setWindow("flat window");}virtual House* GetHouse(void){return m_house;}private:House *m_house; };// 別墅工程隊 class VillaBuilder : public Builder { public:VillaBuilder(void){m_house = new House;}virtual void BuildWall(void){m_house->setWall("villa wall");}virtual void BuildDoor(void){m_house->setDoor("villa door");}virtual void BuildWindow(void){m_house->setWindow("villa window");}virtual House* GetHouse(void){return m_house;}private:House *m_house; };// 設計師 指揮者,負責建造的邏輯 // 建筑隊,干具體的活 class Director { public:Director(Builder *builder){m_build = builder;}void Construct(void){m_build->BuildWall();m_build->BuildWindow();m_build->BuildDoor();}private:Builder * m_build; };int main(int argc, char const *argv[]) {House *house = NULL;Builder *builder = NULL;Director *director = NULL;cout << "villa build" << endl;// 請一個建造別墅的工程隊,建造一個別墅builder = new VillaBuilder;// 設計師 指揮工程隊進行建造director = new Director(builder);// 指揮干活director->Construct();// 建好 交工house = builder->GetHouse();// 客戶驗房house->getWindow();house->getDoor();house->getWall();delete house;delete builder;cout << "flat build" << endl;builder = new FlatBuilder;director = new Director(builder);director->Construct();house = builder->GetHouse();house->getDoor();house->getWall();house->getWindow();delete house;delete builder;delete director;cout << "builder pattern." << endl;return 0; }

    總結

    以上是生活随笔為你收集整理的23种设计模式C++源码与UML实现--建造者模式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。