案例:关于导出数据的的应用框架,可以导出成文本格式,XML格式,Excel格式等。对于导出的文件中主要分为以下三个部分: 头文件:主要描述信息是分公司或者门市点编号,导出数据的日期,文本格式中间用逗号分离 文件主体部分:包括表名称,分条描述数据,对于文本格式,表名称独占一行,数据描述一行算一条数据,字段间用逗号分隔 文件尾部:主要是输入人。
下面为了突出生成器模式,我们先用一般的方法来解决:
1.一般方法
首先来定义header,data,footer的数据源
之后看下ExportToTxt和ExportToXML的实现
客户端调用
运行结果
从上面的结构可以看出,导出Txt或者XML都需要拼接头,主体和尾部内容,完了会输出成为文件,对于不同的输出格式,步骤都是一样的,但是以上述方法存在以下问题:
1.重复处理步骤 2.不利于扩展其他格式的文件
理想中的状态应该是构建每种格式的数据文件处理过程和具体的实现步骤应该是分开的,这样可以很好地切换不同的文件格式,那么这样该如何实现呢?下面就进入生成器模式的学习。
2.认识生成器模式
定义
将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示
生成器模式的结构类图
对于上图中的结构元素的功能说明:
- Builder:生成器接口,定义创建一个Product对象所需的各个部件的操作
- ConcreteBuilder:具体生成器的实现,实现各个部件的创建,并负责组装Product对象的各个部件,同时提供一个获取组装完成后的产品对象的方法。
- Director:指导者,主要用来使用Builder接口,以一个统一的过程来构建所需要的Product对象
- Product:产品,表示被生成器构建的复杂对象,包含多个部件
针对案例,用生成器模式来写,具体如下:
具体步骤如下:
1.规定协议规范,也就是builder
2.实现Builder的具体产品,这里分为TxtBuilder,XMLBuilder
3.组合类,也就是Director,主要是组装各个部件
4.客户端调用
从上述已经可以很清楚的明白生成器的实现结构和模式,主要就是对同一个构建过程,配置不同的生成器实现,就会生成不同的表现。
生成器模式有以下优点
-
松散耦合,将产品的构建和表现完全分离,将构建过程独立出来,使得构建算法可复用,具体表现可以灵活方便地扩展和切换
-
可以很容易地改变产品的内部表示
-
具有更好的复用性
生成器模式的本质就是分离整体构建算法和部件构造,那么使用该模式的场景如下:
- 如果创建对象的算法,应该独立于该对象的组成部分以及它们的装配方式时
- 如果同一个构建过程有着不同的表示时