問題
應用程式中如果需要建立複雜集合體的各個元素,應把複雜集合體的內容放在程式內部,而將展示複雜集合體的**放在程式的視窗級別。
討論
將解析物件例項的持久化內容(比如rtf檔案)的演算法與建立和表示物件例項(比如ascii、tex、文字元件)的演算法分離。本模式的側重點是建立複雜的聚合體物件。
當需要解析外部格式時,呼叫者呼叫生成器服務,每次生成器服務被呼叫,生成器服務都會建立複雜物件例項的一部分,並且在生成器內部保持物件例項的狀態,直到複雜物件例項建立完畢。呼叫結束後,客戶端可以從生成器服務中獲取完整的物件例項。
生成器模式對物件例項建立過程有較好的控制。其它建立型模式一次就可以將物件例項建立成功,而生成器模式可以在呼叫者的控制下一步一步的建立物件例項。
結構
如下圖所示,reader類封裝了解析公共輸入內容的過程。而生成器層(converter類)根據需要將輸入內容轉換為不同的表示形式或者物件例項。
示例
生成器模式將複雜物件的建立過程與表現形式分離,這樣同乙個建立過程可以建立不同的表現形式。該模式可用於在快餐店製作兒童**。兒童**通常包括主食、零食、飲料和玩具,例如乙個漢堡包、炸薯條、一杯可樂和玩具恐龍。需要注意的是,雖然兒童**可以有很多種組合,比如顧客點的主食可以是漢堡包、三明治或者炸雞,但是製作兒童**的過程是相同的。快餐店員工負責將主食、零食和玩具打包在一起,飲料則另外裝在單獨的杯子中。其它的快餐店也是採用的相同的製作過程。
核對列表
1、確認要解決的問題是否存在公共的輸入,並且根據輸入內容生成不同的表現形式或者輸出;
2、在類reader中封裝對公共輸入內容的解析操作;
3、為所有可能的表示形式設計乙個公共的建立方案,在生成器介面中獲取這個方案的所有步驟;
4、為每一種表示形式定義乙個生成器子類,繼承生成器介面;
5、客戶端建立乙個reader類例項和乙個生成器例項,並在read類例項中儲存生成器例項引用;
6、客戶端呼叫reader類例項建立表現形式;
7、客戶端呼叫生成器例項獲取建立成功的表現形式。
經驗
1)有時建立型模式互為補充:生成器模式可以使用其它建立型模式實現物件例項的一步步建立。實現抽象工廠模式、生成器模式和原型模式時可以採用單件模式;
2)生成器模式側重於逐步生成複雜的物件例項,而抽象工廠模式注重建立一組物件例項(不論是簡單物件還是複雜物件)。生成器模式視返回物件例項為物件例項建立過程的最後一步,而抽象工廠模式會立即返回建立的物件例項。
3)生成器模式建立的物件例項通常為複雜物件(混合物);
4)軟體設計之初,常採用工廠模式(該模式實現簡單,定製性強,可通過建立新子類以生成新物件)。隨著設計的深入,設計人員認為程式應該設計的更加靈活時,就會採用抽象工廠模式、原型模式或者生成器模式(這些模式更靈活,**實現也更複雜)。
生成器模式
閱讀 研磨設計模式 筆記。之後若有所感,再補充。生成器模式目的 將乙個複雜的物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。示例 description 描述輸出到檔案頭的物件 author liuwei date 2014 4 17 version 1.0 public class...
生成器模式
生成器模式的定義 將乙個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。我們先來看乙個簡單的例子,比如說product類是乙個複雜的類,構建它需要許多步驟 class product 我們需要定義乙個抽象的生成器類builder,來定義構建product的步驟 abstract ...
生成器模式
定義 將乙個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。生成器模式利用乙個導演者物件和具體建造者物件乙個乙個地建造出所有的零件,從而建造出完整的物件。四個要素 builder 生成器介面,定義建立乙個product物件所需要的各個部件的操作。concretebuilder 具...