[翻译]生成器模式
意圖
- 將復雜對象的實例創建過程與表現形式分離,這樣同一個創建過程可以創建不同的表現形式;
- 將復雜的表現形式進行分解,這樣同一個對象展現過程可以創建不同的表現形式。
問題
? ? 應用程序中如果需要創建復雜集合體的各個元素,應把復雜集合體的內容放在程序內部,而將展示復雜集合體的代碼放在程序的窗口級別。
討論
? ? 將解析對象實例的持久化內容(比如RTF文件)的算法與創建和表示對象實例(比如ASCII、TeX、文本組件)的算法分離。本模式的側重點是創建復雜的聚合體對象。
? ? 當需要解析外部格式時,調用者調用生成器服務,每次生成器服務被調用,生成器服務都會創建復雜對象實例的一部分,并且在生成器內部保持對象實例的狀態,直到復雜對象實例創建完畢。調用結束后,客戶端可以從生成器服務中獲取完整的對象實例。
? ? 生成器模式對對象實例創建過程有較好的控制。其它創建型模式一次就可以將對象實例創建成功,而生成器模式可以在調用者的控制下一步一步的創建對象實例。
結構?
??? 如下圖所示,Reader類封裝了解析公共輸入內容的過程。而生成器層(Converter類)根據需要將輸入內容轉換為不同的表示形式或者對象實例。
?
示例
? ? 生成器模式將復雜對象的創建過程與表現形式分離,這樣同一個創建過程可以創建不同的表現形式。該模式可用于在快餐店制作兒童套餐。兒童套餐通常包括主食、零食、飲料和玩具,例如一個漢堡包、炸薯條、一杯可樂和玩具恐龍。需要注意的是,雖然兒童套餐可以有很多種組合,比如顧客點的主食可以是漢堡包、三明治或者炸雞,但是制作兒童套餐的過程是相同的。快餐店員工負責將主食、零食和玩具打包在一起,飲料則另外裝在單獨的杯子中。其它的快餐店也是采用的相同的制作過程。
?
?核對列表
1、確認要解決的問題是否存在公共的輸入,并且根據輸入內容生成不同的表現形式或者輸出;
2、在類Reader中封裝對公共輸入內容的解析操作;
3、為所有可能的表示形式設計一個公共的創建方案,在生成器接口中獲取這個方案的所有步驟;
4、為每一種表示形式定義一個生成器子類,繼承生成器接口;
5、客戶端創建一個Reader類實例和一個生成器實例,并在Read類實例中保存生成器實例引用;
6、客戶端調用Reader類實例創建表現形式;
7、客戶端調用生成器實例獲取創建成功的表現形式。
經驗
1)有時創建型模式互為補充:生成器模式可以使用其它創建型模式實現對象實例的一步步創建。實現抽象工廠模式、生成器模式和原型模式時可以采用單件模式;
2)生成器模式側重于逐步生成復雜的對象實例,而抽象工廠模式注重創建一組對象實例(不論是簡單對象還是復雜對象)。生成器模式視返回對象實例為對象實例創建過程的最后一步,而抽象工廠模式會立即返回創建的對象實例。
3)生成器模式創建的對象實例通常為復雜對象(混合物);
4)軟件設計之初,常采用工廠模式(該模式實現簡單,定制性強,可通過創建新子類以生成新對象)。隨著設計的深入,設計人員認為程序應該設計的更加靈活時,就會采用抽象工廠模式、原型模式或者生成器模式(這些模式更靈活,代碼實現也更復雜)。
?
原文地址:http://sourcemaking.com/design_patterns/builder
下面的鏈接是我寫的一個實例程序:
http://pan.baidu.com/s/1dDpJwjR
總結
- 上一篇: Bilinear Pairing双线性配
- 下一篇: 常用的十种算法