Builder 設計模式的學習
Buileder(生成器)—對象創建型模式
一 意圖
將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
二 適用性
在以下情況使用Build模式:
1 當創建復雜對象的算法應該獨立於該對象的組成部分以及它們的裝配方式時。
2 當構造過程必須允許被構造的對象有不同的表示時。
3 Builder模式要解決的也正是這樣的問題:
當我們要創建的對象很復雜的時候(通常是由很多其他的對象組合而成),
我們要復雜對象的創建過程和這個對象的表示(展示)分離開來,
這樣做的好處就是通過一步步的進行復雜對象的構建,
由於在每一步的構造過程中可以引入參數,使得經過相同的步驟創建最後得到的對象的展示不一樣。
在書中第一個例子RTF文檔閱讀器的實現中,可以看到文檔RTFReader支持。
從此圖中可以看到:
1封裝了三種復雜對象的構建:
ASCIIText,TeXText,TextWiWdget,分別對應不同的builder
2 同樣的創建過程創建不同的表示
可以在RTFReader中對文檔進行解析的時候while循環,對於同樣的文檔,使用不同builder創建產品,同樣過程可以得到不同的表示。
3 復雜對象構建分過程進行
在while循環中,可以看到對不同類型的文檔構件,處理的方式不同。分成不同的部分進行處理。
三 結構圖
四 交互過程
Director:是構造一個使用Builder接口的對象
Client創建Director對象,並用它所想要的Builder對象進行配置。
Director創建和裝配對象過程
五 實例分析
在這個例子中:VcpTextView支持以下幾種顯示方式:
UnicodeText,RichText,IconObject,CoustomObject。
每一種之間都是獨立不可替換的,相對具有比較復雜的算法。
在顯示的時候使用VcpTextBasicLayout來導向裝配顯示各元素。
但是在大多數實際應用中很多情況,不可能完全的找出書中所描述的情形,
大多數只是在某一部分是符合Builder模式。
六 分析總結
效果:
1 隱藏產品的內部表示
Builder提供創建產品的接口給Director,
隱藏了產品的內部結構(僅提供接口BuildPart()創建產品)
隱藏該產品是如何裝配的(BuildPart()內部裝配是隱藏的)。
2 將構造代碼和表示代碼分開
構造代碼是在Builder提供的接口中完成的,每個ConcreateBuilder包含了創建和裝配一個特定產品的所有代碼。
提供不同的Builder,使用相同的Director導向過程可以得到不同的表示。
使用的不同Client可以使用相同的Builder,得到不同相同的表示。
在前面RTFReader閱讀器的例子中:
如果提供ASCIIText Converter 則只能得到ASCIIText,提供TexText Converter則可以得到TexText。
如果使用XMLReader,提供ASCIIText Converter 使用Director得到不同於的ASCIIText的表示。
所以將構造代碼和表示代碼分開,可以使代碼得到重用。
3 精確的控制導向產品的創建
將代碼的構建過程委托為Director去完成,那麽Client可以不用關註產品的構建過程
何時完成或者完成到什麽程度,交給Director去控制產品的創建和裝配的過程。並返回所創建的產品,或者通知Client。
在實際的使用情況中可能都並非如此,大多數只能在某些部分匹配Builder模式。
推薦一篇關於Builder模式文章闡述的不錯:
http://www.cnblogs.com/happyhippy/archive/2010/09/01/1814287.html
Builder 設計模式的學習