意图
- 将复杂对象的实例创建过程与表现形式分离,这样同一个创建过程可以创建不同的表现形式;
- 将复杂的表现形式进行分解,这样同一个对象展现过程可以创建不同的表现形式。
问题
应用程序中如果需要创建复杂集合体的各个元素,应把复杂集合体的内容放在程序内部,而将展示复杂集合体的代码放在程序的窗口级别。
讨论
将解析对象实例的持久化内容(比如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
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!