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

一、实际问题

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

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

二、问题分析

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

三、生成器模式

1.定义

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

2.问题拆分

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

3.类图:

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

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

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

每天一个设计模式-7 生成器模式(Builder)的更多相关文章

  1. 【设计模式】- 生成器模式(Builder)

    生成器模式 建造者模式.Builder 生成器模式 也叫建造者模式,可以理解成可以分步骤创建一个复杂的对象.在该模式中允许你使用相同的创建代码生成不同类型和形式的对象. 生成器的结构模式 生成器(Bu ...

  2. 设计模式十: 生成器模式(Builder Pattern)

    简介 生成器模式属于创建型模式的一种, 又叫建造者模式. 生成器模式涉及4个关键角色:产品(Product),抽象生成器(builder),具体生成器(ConcreteBuilder),指挥者(Dir ...

  3. 每天一个设计模式-2 外观模式(Facade)

    每天一个设计模式-2  外观模式(Facade) 1.生活中的示例 客户想要购买一台电脑,一般有两种方法: 1.自己DIY,客户需要知道组成电脑的所有电子器件,并且需要熟悉那些配件,对客户要求较高. ...

  4. 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)

    原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...

  5. 第9月第6天 push pop动画 生成器模式(BUILDER)

    1. https://github.com/MichaelHuyp/QQNews 2.生成器模式(BUILDER) class MazeBuilder { public: virtual void B ...

  6. 跟着实例学习设计模式(6)-生成器模式builder(创建型)

    生成器模式是创建型设计模式. 设计意图:将一个复杂的类表示与其构造相分离,使得同样的构建过程可以得出不同的表示. 实例类图: IVehicleBuilder:抽象建造者.为创建一个Vehicle对象并 ...

  7. 面向对象设计模式_生成器模式详解(Builder Pattern)

    首先提出一个很容易想到应用场景: 手机的生产过程:手机有非常多的子件(部件),成千上万,不同品牌的手机的生产过程都是复杂而有所区别的,相同品牌的手机在设计上也因客户需求多样化,大到型号,小到颜色,是否 ...

  8. 面向对象设计模式_生成器模式解读(Builder Pattern)

    首先提出一个很容易想到应用场景: 手机的生产过程:手机有非常多的子件(部件),成千上万,不同品牌的手机的生产过程都是复杂而有所区别的,相同品牌的手机在设计上也因客户需求多样化,大到型号,小到颜色,是否 ...

  9. C#设计模式——生成器模式(Builder Pattern)

    一.概述在软件系统中,有时候面临着复杂的对象创建,该对象由一定算法构成的子对象组成,由于需求变化,这些子对象会经常变换,但组合在一起的算法却是稳定的.生成器模式可以处理这类对象的构建,它提供了一种封装 ...

随机推荐

  1. CoreCLR源码探索(一) Object是什么

    .Net程序员们每天都在和Object在打交道 如果你问一个.Net程序员什么是Object,他可能会信誓旦旦的告诉你"Object还不简单吗,就是所有类型的基类" 这个答案是对的 ...

  2. Spring之旅

    Java使得以模块化构建复杂应用系统成为可能,它为Applet而来,但为组件化而留. Spring是一个开源的框架,最早由Rod Johnson创建.Spring是为了解决企业级应用开发的复杂性而创建 ...

  3. Android混合开发之WebViewJavascriptBridge实现JS与java安全交互

    前言: 为了加快开发效率,目前公司一些功能使用H5开发,这里难免会用到Js与Java函数互相调用的问题,这个Android是提供了原生支持的,不过存在安全隐患,今天我们来学习一种安全方式来满足Js与j ...

  4. C++中的const

    一,C++中const的基本知识 1.C++中const的基本概念 1.const是定义常量的关键字,表示只读,不可以修改. 2.const在定义常量的时候必须要初始化,否则报错,因为常量无法修改,只 ...

  5. Java中的进程和线程

     Java中的进程与线程 一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是 ...

  6. 在Linux(Luna)下向Launch启动器中添加图标

    记录下在Luna下向Launch中添加图标的步骤,以供以后参考,这里我以加入eclipse图标为例: 首先,我们来创建一个desktop文件(Luna中到启动器Launch可以看作是Ubuntu中到桌 ...

  7. CentOS Mono Nginx 部署 MVC4+WebApi

    CentOS Mono Nginx 部署 MVC4+WebApi 经过几天的折磨,终于在CentOS上成功部署了MVC4+WebApi.Mono上的服务器推荐两种:Jexus(国产高人写的一款很牛的服 ...

  8. 【腾讯Bugly干货分享】WebVR如此近-three.js的WebVR示例解析

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57c7ff1689a6c9121b1adb16 作者:苏晏烨 关于WebVR 最 ...

  9. 【腾讯Bugly干货分享】跨平台 ListView 性能优化

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/FbiSLPxFdGqJ00WgpJ94yw 导语 精 ...

  10. MapReduce剖析笔记之六:TaskTracker初始化任务并启动JVM过程

    在上面一节我们分析了JobTracker调用JobQueueTaskScheduler进行任务分配,JobQueueTaskScheduler又调用JobInProgress按照一定顺序查找任务的流程 ...