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