意圖
將一個復雜對象的構建與它的表示分離舌稀,使得同樣的構建過程可以創(chuàng)建不同的表示啊犬。
動機
問題
一個RTF文檔有多種轉(zhuǎn)換方式,未來會增加新的轉(zhuǎn)換方式壁查。
解決方式
封裝轉(zhuǎn)換器觉至,傳給給RTF閱讀器,讓RTF閱讀器進行語法分析提煉出各個部件潮罪,然后把各個部件的構造或裝配工作委托給轉(zhuǎn)換器康谆,這樣可以重用閱讀器的語法分析的算法。
示例圖形
![](https://raw.githubusercontent.com/iDragonfly2050/iDragonfly-File/master/Blog/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/e946a620-c9e2-4325-9141-6cf15846578b.jpg)
適用性
- 對于一個擁有許多組成部件的復雜對象嫉到,想要將此復雜對象的創(chuàng)建算法和其組成部件的裝配(構造)方式獨立開來時沃暗。
- 當構造過程必須允許被構造的對象的組成部件有不同的表示時。
結構
![](https://raw.githubusercontent.com/iDragonfly2050/iDragonfly-File/master/Blog/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/e3331776-895c-48ec-8ab5-11555d510ec7.png)
參與者
- Builder:為創(chuàng)建一個產(chǎn)品對象的各個部件指定抽象接口何恶。
- ConcreteBuilder:
- 實現(xiàn)Builder聲明的接口以構造和裝配該產(chǎn)品的各個部件孽锥。
- 提供一個獲取最終產(chǎn)品的接口。
- Director(導向器):將復雜對象的各個部件的構造和裝配委托給某個ConcreteBuilder细层。
- Product:由ConcreteBuilder最終構造完成的復雜對象惜辑。
協(xié)作
- 客戶創(chuàng)建Director和Builder,用Builder來配置Director疫赎。
- 一旦產(chǎn)品部件被生成盛撑,Director會將部件發(fā)送給Builder。
- Builder處理Director的請求捧搞,并且將部件裝配到產(chǎn)品中抵卫。
- 客戶從Builder中獲取產(chǎn)品。
-
交互圖:
效果
- 可以通過定義一個新的ConcreteBuilder改變一個產(chǎn)品的各個部件表現(xiàn)形式胎撇。
- 將構造代碼和表示代碼分開介粘,使得容易增加新的構造方式或者新的表示形式。
- 可以通過定義一個新的ConcreteBuilder來對復雜對象構造過程進行更精細的控制晚树。
實現(xiàn)
- Builder提供的接口必須足夠普遍姻采,以便ConcreteBuilder重寫。
- 若構造一個新部件需要訪問前面已經(jīng)構造了的部件爵憎,可以讓Builder將部件返回給Director慨亲,然后Director又將部件回傳給Builder去生成新部件婚瓜。
- Builder中的方法不應該聲明為純虛成員函數(shù),這樣客戶可以只重定義他們感興趣的操作而不是所有操作巡雨。
- 不定義產(chǎn)品抽象類闰渔,因為用ConcreteBuilder生成的具體產(chǎn)品通常差別很大席函,而因為ConcreteBuilder是客戶定義的铐望,所以客戶通常知道生成的產(chǎn)品是怎樣的。