# [](http://www.cnblogs.com/feihe0755/p/3511263.html)
定義: 建造者模式(Builder Pattern),? 將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
類型:創建型模式。
類圖:

參與角色:
1. Product,定義了一組產品的部件,并且有一個方法來表示對象。
1. Builder,提供一系列Product對象每個部件構成的接口。
1. BuilderA、BuilderB通過實現父類的接口來完成產品各部分的構造。
1. Director,構造使用Builder接口的對象。
概述:
?????? 產品的不同,是由具體的構建過程不同造成的,所以把每個產品不同的地方抽象出來。這樣不同產品,就不需要用派生新的產品類來完成,只需要匹配不同的構建過程類即可。Builder只是完成從產品中分離出來的每個小部件的生成的接口。具體的創建順序以及創建邏輯則由Director控制。理論上是可以不要Director,而直接由Builder的派生類來完成的。Director的作用是利用Builder提供的接口,按一定規則,選擇一定的部件來完成產品的建造。
??????? 一個好的示例對于理解建造者模式非常重要。很多書上的示例還是有些過于復雜。而網絡上的一些示例,有很多表達得并不是很清晰,沒有吃透建造者模式的關鍵點。
??????? 建造者,我這里舉一個與房屋建造有關的示例,能夠比較好地詮釋建造者模式的關鍵點。下面結合代碼一點一點來分析。
代碼:
~~~
// Product:產品是帶裝修的房子,這里的裝修列得比較簡單,列了幾個代表性的裝修點
~~~
[]( "復制代碼")
~~~
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 };
~~~
[]( "復制代碼")
// Builder,即抽象出產品不同的原因,即具體裝修點的裝修不同造成的。
//?那么就把這幾個不同裝修點的裝修過程抽象出來作為一個類
//?另外該類還實現了產品的新建、銷毀以及獲取產品
[]( "復制代碼")
~~~
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 };
~~~
[]( "復制代碼")
// BuilderA,在這里即復古風裝修
//?具體實現Decoration的幾個虛函數來完成復古風的的每個部件的生成。
[]( "復制代碼")
~~~
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 };
~~~
[]( "復制代碼")
// BuilderB,在這里即時尚風裝修
//?同樣是具體實現Decoration的幾個虛函數來完成復古風的的每個部件的生成。
[]( "復制代碼")
~~~
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 };
~~~
[]( "復制代碼")
// Director,指導如何按步驟地去完成房屋的裝修,另外還可以分精裝修,簡裝修,甚至是其它裝修方式
//?就是根據Builder提供的接口來完成指定要求的裝修
[]( "復制代碼")
~~~
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 };
~~~
[]( "復制代碼")
//?具體客戶端的使用情況
[]( "復制代碼")
~~~
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 }
~~~
[]( "復制代碼")
優缺點:
1. 優點,從構建方式上抽象出不同的產品來,最大限度地展現了OOP抽象的作用。另外可以結合工廠方法模式,定制不同的Director,這樣就可以得到不同的產品。
1. 缺點,如果產品的表示變化了,那么一系列類都需要變動。
參考資料:
1. 《設計模式——可復用面向對象軟件基礎》
1. 《Java與模式》
1. 《大話設計模式》
[源代碼下載](http://files.cnblogs.com/feihe0755/Design5.zip)
- 前言
- 設計模式六大原則
- 1——創建型模式之簡單工廠模式
- 2——創建型模式之工廠方法模式
- 3——創建型模式之抽象工廠模式
- 4——創建型模式之單例模式
- 5——創建型模式之建造者模式
- 6——創建型模式之原型模式
- 7——結構型模式之適配器模式
- 8——結構型模式之橋接模式
- 9——結構型模式之組合模式
- 10——結構型模式之裝飾者模式
- 11——結構型模式之外觀模式
- 12——結構型模式之享元模式
- 13——結構型模式之代理模式
- 14——行為型模式之職責鏈模式
- 15——行為型模式之命令模式
- 16——行為型模式之解釋器模式
- 17——行為型模式之迭代器模式
- 18——行為型模式之中介者模式
- 19——行為型模式之備忘錄模式
- 20——行為型模式之觀察者模式
- 21——行為型模式之狀態模式
- 22——行為型模式之策略模式
- 23——行為型模式之模板方法模型
- 24——行為型模式之訪問者模式
- 設計模式總結