[翻译]生成器模式

意图

  • 将复杂对象的实例创建过程与表现形式分离,这样同一个创建过程可以创建不同的表现形式;
  • 将复杂的表现形式进行分解,这样同一个对象展现过程可以创建不同的表现形式。

问题

    应用程序中如果需要创建复杂集合体的各个元素,应把复杂集合体的内容放在程序内部,而将展示复杂集合体的代码放在程序的窗口级别。

讨论

    将解析对象实例的持久化内容(比如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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值