首页 技术 正文
技术 2022年11月6日
0 收藏 392 点赞 860 浏览 3378 个字

每天一个设计模式-7 生成器模式(Builder)

一、实际问题

在讨论工厂方法模式的时候,提到了一个导出数据的应用框架,但是并没有涉及到导出数据的具体实现,这次通过生成器模式来简单实现导出成文本,Xml等具体的格式。

导出成文本或Xml等格式的数据时,一般都会有各自的格式,比如:导出的文件都有3个部分,文件头,内容,尾。

二、问题分析

无论哪种导出格式,都需要3个部分,文件头,内容,尾等信息,并且他们的内容相同。即他们的构造算法固定,只是生成的结果不同;能不能把算法(构建)和结果(外观)分离出来呢?

三、生成器模式

1.定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

2.问题拆分

无论哪个导出格式均需要文件头,内容,尾,构建这三个部分就是定义中提到的构建过程,每种格式具体的步骤实现,就是不同的表示。接下来利用生成器模式解决上边的问题:

3.类图:

根据对问题的拆分,因为不同导出格式拥有相同的构建过程(算法),我们可以把构造头,内容,尾等方法写成一个接口,导出的不同格式通过实现这个接口,使得算法得到复用。

每天一个设计模式-7 生成器模式(Builder)

类图内容比较简单,就不一一介绍了。

UML类图讲解:http://blog.csdn.net/tianhai110/article/details/6339565

源代码:

public interface Builder {    /**     *     * @param content     */    public void buildContent(String content);    /**     *     * @param header     */    public void buildHeader(String header);    /**     *     * @param tail     */    public void buildTail(String tail);    public void getResult();}

Builder接口

public class TxtBuilder implements Builder {    public TxtBuilder(){    }    private String header;    private String content;    private String tail;    public void finalize() throws Throwable {    }    /**     *     * @param content     */    public void buildContent(String content){        this.content=content;        System.out.println("构建Txt格式的文本内容:"+content);    }    /**     *     * @param header     */    public void buildHeader(String header){        this.header=header;        System.out.println("构建Txt格式的头部内容:"+header);    }    /**     *     * @param tail     */    public void buildTail(String tail){        this.tail=tail;        System.out.println("构建Txt格式的尾部内容:"+tail);    }    public void getResult(){        System.out.println("返回Txt格式的结果:");        System.out.println(header);        System.out.println(content);        System.out.println(tail);    }}

TxtBuilder实现Builder接口

public class XmlBuilder implements Builder {    public XmlBuilder(){    }private String header;private String content;private String tail;    public void finalize() throws Throwable {    }    /**     *     * @param content     */    public void buildContent(String content){        this.content = content;        System.out.println("构建Xml格式的详细内容");    }    /**     *     * @param header     */    public void buildHeader(String header){        this.header= header;        System.out.println("构建Xml格式的头部内容");    }    /**     *     * @param tail     */    public void buildTail(String tail){        this.tail = tail;        System.out.println("构建Xml格式的尾部内容");    }    public void getResult(){        System.out.println("返回Xml格式的结果");        System.out.println(header);        System.out.println(content);        System.out.println(tail);    }}

XmlBuilder实现Builder接口

public class Director {    public Builder m_Builder;    public void finalize() throws Throwable {    }    /**     *     * @param builder     */    public Director(Builder builder){        this.m_Builder = builder;    }    /**     *     * @param tail     * @param content     * @param header     */    public void construct(String tail, String content, String header){        this.m_Builder.buildHeader(header);        this.m_Builder.buildContent(content);        this.m_Builder.buildTail(tail);    }}

Director指导者,用来指导如何构造

public class Client {public static void main(String args[]){    Builder xmlbuilder = new XmlBuilder();    Builder txtbuilder = new TxtBuilder();    Director director = new Director(xmlbuilder);    director.construct("我是头部", "我是内容", "我是尾部");    xmlbuilder.getResult();}}

Client客户端

四、模式讲解

1.模式的思想

生成器模式的构造过程是统一的,固定不变的变化的部分放到生成器部分,只要配置不同的生成器,那么同样的构建过程就能构建出不同的产品来。

重点:

1.生成器模式主要由两部分组成:部件构造及装配,整体构建的算法
2.将变化的部分和不变的部分分离出来。

当然,在实际项目中,生成器的使用往往不是这么简单的,毕竟生成器模式是应用于构造复杂对象的模式。

2.指导者和生成器的交互

在生成器模式里面,指导者和生成器的交互是通过生成器的buildPart方法来完成的,在前面的实例中,指导者与生成器并没有太多的交互,而真正的项目开发中,指导者通常会实现比较复杂的算法或者运算过程,在实际中很可能会有一下情况:

  • 在运行指导者的时候,会按照整体构建算法的步骤进行运算,可能先运行前几步运算,到了某一步骤,需要具体创建某个部件对象了,然后调用Builder中创建相应部件的方法来创建具体的部件。同时,把前面运算得到的数据传递给Builder,因为在Builder内部实现创建和组装部件的时候,可能会需要这些数据。
  • Builder创建完具体部件对象后,将对象返回给指导者,指导者继续后续的算法运算,可能会用已经创建好的对象。
  • 如此反复,这道整个构建算法完成为止。

通过上边的描述,可以看出,指导者与生成器之间是要有交互的,这只是可能的情况之一,需要如何实现,还得根据具体需要,这需要根据项目情况来决定。只要把握好设计模式的思想即可。

五、总结

生成器的本质:分离整体构建算法和部件构造

博主写博客不容易,转载注明出处:http://www.cnblogs.com/xiemubg/p/6107517.html

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,964
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,486
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,331
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,114
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,747
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,781