意圖
將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
動機
問題
一個RTF文檔有多種轉換方式,未來會增加新的轉換方式。
解決方式
封裝轉換器,傳給給RTF閱讀器,讓RTF閱讀器進行語法分析提煉出各個部件,然后把各個部件的構造或裝配工作委托給轉換器,這樣可以重用閱讀器的語法分析的算法。
示例圖形

適用性
- 對于一個擁有許多組成部件的復雜對象,想要將此復雜對象的創建算法和其組成部件的裝配(構造)方式獨立開來時。
- 當構造過程必須允許被構造的對象的組成部件有不同的表示時。
結構

參與者
- Builder:為創建一個產品對象的各個部件指定抽象接口。
- ConcreteBuilder:
- 實現Builder聲明的接口以構造和裝配該產品的各個部件。
- 提供一個獲取最終產品的接口。
- Director(導向器):將復雜對象的各個部件的構造和裝配委托給某個ConcreteBuilder。
- Product:由ConcreteBuilder最終構造完成的復雜對象。
協作
- 客戶創建Director和Builder,用Builder來配置Director。
- 一旦產品部件被生成,Director會將部件發送給Builder。
- Builder處理Director的請求,并且將部件裝配到產品中。
- 客戶從Builder中獲取產品。
-
交互圖:
效果
- 可以通過定義一個新的ConcreteBuilder改變一個產品的各個部件表現形式。
- 將構造代碼和表示代碼分開,使得容易增加新的構造方式或者新的表示形式。
- 可以通過定義一個新的ConcreteBuilder來對復雜對象構造過程進行更精細的控制。
實現
- Builder提供的接口必須足夠普遍,以便ConcreteBuilder重寫。
- 若構造一個新部件需要訪問前面已經構造了的部件,可以讓Builder將部件返回給Director,然后Director又將部件回傳給Builder去生成新部件。
- Builder中的方法不應該聲明為純虛成員函數,這樣客戶可以只重定義他們感興趣的操作而不是所有操作。
- 不定義產品抽象類,因為用ConcreteBuilder生成的具體產品通常差別很大,而因為ConcreteBuilder是客戶定義的,所以客戶通常知道生成的產品是怎樣的。