<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # [](http://www.cnblogs.com/feihe0755/p/3511263.html) 定義: 建造者模式(Builder Pattern),? 將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。 類型:創建型模式。 類圖: ![](http://images.cnitblog.com/blog/533465/201401/081951449887.x-png) 參與角色: 1. Product,定義了一組產品的部件,并且有一個方法來表示對象。 1. Builder,提供一系列Product對象每個部件構成的接口。 1. BuilderA、BuilderB通過實現父類的接口來完成產品各部分的構造。 1. Director,構造使用Builder接口的對象。 概述: ?????? 產品的不同,是由具體的構建過程不同造成的,所以把每個產品不同的地方抽象出來。這樣不同產品,就不需要用派生新的產品類來完成,只需要匹配不同的構建過程類即可。Builder只是完成從產品中分離出來的每個小部件的生成的接口。具體的創建順序以及創建邏輯則由Director控制。理論上是可以不要Director,而直接由Builder的派生類來完成的。Director的作用是利用Builder提供的接口,按一定規則,選擇一定的部件來完成產品的建造。 ??????? 一個好的示例對于理解建造者模式非常重要。很多書上的示例還是有些過于復雜。而網絡上的一些示例,有很多表達得并不是很清晰,沒有吃透建造者模式的關鍵點。 ??????? 建造者,我這里舉一個與房屋建造有關的示例,能夠比較好地詮釋建造者模式的關鍵點。下面結合代碼一點一點來分析。 代碼: ~~~ // Product:產品是帶裝修的房子,這里的裝修列得比較簡單,列了幾個代表性的裝修點 ~~~ [![復制代碼](https://box.kancloud.cn/2015-10-30_5632e1b8d3b57.gif)]( "復制代碼") ~~~ 1 class CHouse 2 { 3 public: 4 void Show() 5 { 6 cout<<m_strFloor<<endl; 7 cout<<m_strCeiling<<endl; 8 cout<<m_strWall<<endl; 9 } 10 public: 11 string m_strFloor; 12 string m_strCeiling; 13 string m_strWall; 14 }; ~~~ [![復制代碼](https://box.kancloud.cn/2015-10-30_5632e1b8d3b57.gif)]( "復制代碼") // Builder,即抽象出產品不同的原因,即具體裝修點的裝修不同造成的。 //?那么就把這幾個不同裝修點的裝修過程抽象出來作為一個類 //?另外該類還實現了產品的新建、銷毀以及獲取產品 [![復制代碼](https://box.kancloud.cn/2015-10-30_5632e1b8d3b57.gif)]( "復制代碼") ~~~ 1 class CDecoration 2 { 3 public: 4 void CreateHouse() 5 { 6 m_pHouse = new CHouse(); 7 } 8 void DestoryHouse() 9 { 10 delete m_pHouse; 11 m_pHouse = NULL; 12 } 13 CHouse* GetHouse() 14 { 15 return m_pHouse; 16 } 17 virtual void SetFloor(){} 18 virtual void SetCeiling(){} 19 virtual void SetWall(){} 20 21 protected: 22 CHouse* m_pHouse; 23 }; ~~~ [![復制代碼](https://box.kancloud.cn/2015-10-30_5632e1b8d3b57.gif)]( "復制代碼") // BuilderA,在這里即復古風裝修 //?具體實現Decoration的幾個虛函數來完成復古風的的每個部件的生成。 [![復制代碼](https://box.kancloud.cn/2015-10-30_5632e1b8d3b57.gif)]( "復制代碼") ~~~ 1 class CVintageDecoration : public CDecoration 2 { 3 public: 4 void SetFloor() 5 { 6 m_pHouse->m_strFloor = "安裝紅木地板"; 7 } 8 9 void SetCeiling() 10 { 11 m_pHouse->m_strCeiling = "安裝復古風頂燈"; 12 } 13 14 void SetWall() 15 { 16 m_pHouse->m_strWall = "安裝中國山水風格壁畫"; 17 } 18 }; ~~~ [![復制代碼](https://box.kancloud.cn/2015-10-30_5632e1b8d3b57.gif)]( "復制代碼") // BuilderB,在這里即時尚風裝修 //?同樣是具體實現Decoration的幾個虛函數來完成復古風的的每個部件的生成。 [![復制代碼](https://box.kancloud.cn/2015-10-30_5632e1b8d3b57.gif)]( "復制代碼") ~~~ 1 class CFashionDecoration : public CDecoration 2 { 3 public: 4 void SetFloor() 5 { 6 m_pHouse->m_strFloor = "安裝實木地板"; 7 } 8 9 void SetCeiling() 10 { 11 m_pHouse->m_strCeiling = "安裝時尚大吊燈"; 12 } 13 14 void SetWall() 15 { 16 m_pHouse->m_strWall = "張貼亮麗鮮艷壁畫"; 17 } 18 }; ~~~ [![復制代碼](https://box.kancloud.cn/2015-10-30_5632e1b8d3b57.gif)]( "復制代碼") // Director,指導如何按步驟地去完成房屋的裝修,另外還可以分精裝修,簡裝修,甚至是其它裝修方式 //?就是根據Builder提供的接口來完成指定要求的裝修 [![復制代碼](https://box.kancloud.cn/2015-10-30_5632e1b8d3b57.gif)]( "復制代碼") ~~~ 1 class CDirector 2 { 3 public: 4 // 精裝修,地板,墻壁,天花板都裝修 5 void RefineDecorate(CDecoration* _pDecorate) 6 { 7 _pDecorate->CreateHouse(); 8 _pDecorate->SetFloor(); 9 _pDecorate->SetCeiling(); 10 _pDecorate->SetWall(); 11 } 12 13 // 簡裝,只裝修地板 14 void SimpleDecorate(CDecoration* _pDecorate) 15 { 16 _pDecorate->CreateHouse(); 17 _pDecorate->SetFloor(); 18 } 19 }; ~~~ [![復制代碼](https://box.kancloud.cn/2015-10-30_5632e1b8d3b57.gif)]( "復制代碼") //?具體客戶端的使用情況 [![復制代碼](https://box.kancloud.cn/2015-10-30_5632e1b8d3b57.gif)]( "復制代碼") ~~~ 1 int _tmain(int argc, _TCHAR* argv[]) 2 { 3 CHouse* pHouse = NULL; 4 CDirector director; 5 6 // 小明的房子想要復古風的精裝修 7 CVintageDecoration vintageBuilder; 8 director.RefineDecorate(&vintageBuilder); 9 pHouse = vintageBuilder.GetHouse(); 10 pHouse->Show(); 11 vintageBuilder.DestoryHouse(); 12 13 // 小雷的房子暫時只想要復古風的簡裝修 14 director.SimpleDecorate(&vintageBuilder); 15 pHouse = vintageBuilder.GetHouse(); 16 pHouse->Show(); 17 vintageBuilder.DestoryHouse(); 18 19 // 小紅的房子想要時尚風的精裝修 20 CFashionDecoration fashionBuilder; 21 director.RefineDecorate(&fashionBuilder); 22 pHouse = vintageBuilder.GetHouse(); 23 pHouse->Show(); 24 fashionBuilder.DestoryHouse(); 25 26 // 小梅的房子也只想要時尚風的簡裝 27 director.SimpleDecorate(&fashionBuilder); 28 pHouse = vintageBuilder.GetHouse(); 29 pHouse->Show(); 30 fashionBuilder.DestoryHouse(); 31 32 return 0; 33 } ~~~ [![復制代碼](https://box.kancloud.cn/2015-10-30_5632e1b8d3b57.gif)]( "復制代碼") 優缺點: 1. 優點,從構建方式上抽象出不同的產品來,最大限度地展現了OOP抽象的作用。另外可以結合工廠方法模式,定制不同的Director,這樣就可以得到不同的產品。 1. 缺點,如果產品的表示變化了,那么一系列類都需要變動。 參考資料: 1. 《設計模式——可復用面向對象軟件基礎》 1. 《Java與模式》 1. 《大話設計模式》 [源代碼下載](http://files.cnblogs.com/feihe0755/Design5.zip)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看