1、意圖
將一個複雜對象的構建與它的表示分離開,使得同樣的構建過程可以創建不同的表示。
2、問題
- 創建複雜對象的算法應該獨立於該對象的組成部分以及它們的裝配方式。
- 構造過程必須允許被構造的對象有不同的表示。
3、解決方案
將複雜對象的構造方法獨立出來。
4、通用結構
5、參與者
- builder:爲創建一個Product的各個部件指定抽象接口。
- ConcreteBuilder:實現Builder的各個接口以構造和裝配該產品的的各個部件;定義並明確它所創建的表示;提供一個查詢產品的接口。
- Director:構造一個使用Builder接口的對象。
- Product:表示被構造的複雜對象。ConcreteBuilder創建該產品的內部表示並定義它的裝配過程;包含定義組成部件的類,包括將這些部件裝配成最終產品的接口。
6、協作
- 客戶創建Director對象並使用它所想要的Builder對象進行配置;
- 一旦產品部件被生成,Director(導向器)將會通知Builder(生成器);
- Builder處理Director的請求,並將該部件添加到該產品中;
- 客戶從Builder中得到產品結果。
7、效果
- 很容易改變一個產品的內部表示: 因爲產品是通過抽象接口構造的,在改變一個產品的內部表示時只需要創建一個新的生成器。
- 將構造代碼和表示代碼分開:客戶不需要知道定義產品內部結構的類的所有信息。
- 對構造過程進行更精細的控制
8、實現
- Builder類的接口需要足夠普遍,以便爲各種類型的具體生成器構造產品。
- C++中,聲明Builder類的抽象接口不聲明爲純虛函數,而是把他們定義爲空方法,這是客戶只需重定義他們感興趣的操作。
9、實例