每天一个设计模式-7 生成器模式(Builder)
每天一个设计模式-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)的更多相关文章
- 【设计模式】- 生成器模式(Builder)
生成器模式 建造者模式.Builder 生成器模式 也叫建造者模式,可以理解成可以分步骤创建一个复杂的对象.在该模式中允许你使用相同的创建代码生成不同类型和形式的对象. 生成器的结构模式 生成器(Bu ...
- 设计模式十: 生成器模式(Builder Pattern)
简介 生成器模式属于创建型模式的一种, 又叫建造者模式. 生成器模式涉及4个关键角色:产品(Product),抽象生成器(builder),具体生成器(ConcreteBuilder),指挥者(Dir ...
- 每天一个设计模式-2 外观模式(Facade)
每天一个设计模式-2 外观模式(Facade) 1.生活中的示例 客户想要购买一台电脑,一般有两种方法: 1.自己DIY,客户需要知道组成电脑的所有电子器件,并且需要熟悉那些配件,对客户要求较高. ...
- 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)
原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...
- 第9月第6天 push pop动画 生成器模式(BUILDER)
1. https://github.com/MichaelHuyp/QQNews 2.生成器模式(BUILDER) class MazeBuilder { public: virtual void B ...
- 跟着实例学习设计模式(6)-生成器模式builder(创建型)
生成器模式是创建型设计模式. 设计意图:将一个复杂的类表示与其构造相分离,使得同样的构建过程可以得出不同的表示. 实例类图: IVehicleBuilder:抽象建造者.为创建一个Vehicle对象并 ...
- 面向对象设计模式_生成器模式详解(Builder Pattern)
首先提出一个很容易想到应用场景: 手机的生产过程:手机有非常多的子件(部件),成千上万,不同品牌的手机的生产过程都是复杂而有所区别的,相同品牌的手机在设计上也因客户需求多样化,大到型号,小到颜色,是否 ...
- 面向对象设计模式_生成器模式解读(Builder Pattern)
首先提出一个很容易想到应用场景: 手机的生产过程:手机有非常多的子件(部件),成千上万,不同品牌的手机的生产过程都是复杂而有所区别的,相同品牌的手机在设计上也因客户需求多样化,大到型号,小到颜色,是否 ...
- C#设计模式——生成器模式(Builder Pattern)
一.概述在软件系统中,有时候面临着复杂的对象创建,该对象由一定算法构成的子对象组成,由于需求变化,这些子对象会经常变换,但组合在一起的算法却是稳定的.生成器模式可以处理这类对象的构建,它提供了一种封装 ...
随机推荐
- CLR 这些年有啥变化吗?
引言 首先想给初学者推荐下<CLR via C#>这本好书,做.Net开发的开发者应该都读一下.为避免广告之嫌,所以这里只提供豆瓣书评的链接. CLR 作为.Net 程序跨平台运行的载体, ...
- 使用ServiceStack构建Web服务
提到构建WebService服务,大家肯定第一个想到的是使用WCF,因为简单快捷嘛.首先要说明的是,本人对WCF不太了解,但是想快速建立一个WebService,于是看到了MSDN上的这一篇文章 Bu ...
- 一步一步使用ABP框架搭建正式项目系列教程
研究ABP框架好多天了,第一次看到这个框架的名称到现在已经很久了,但由于当时内功有限,看不太懂,所以就只是大概记住了ABP这个名字.最近几天,看到了园友@阳光铭睿的系列ABP教程,又点燃了我内心要研究 ...
- scrapy爬虫docker部署
spider_docker 接我上篇博客,为爬虫引用创建container,包括的模块:scrapy, mongo, celery, rabbitmq,连接https://github.com/Liu ...
- Android权限管理之Android 6.0运行时权限及解决办法
前言: 今天还是围绕着最近面试的一个热门话题Android 6.0权限适配来总结学习,其实Android 6.0权限适配我们公司是在今年5月份才开始做,算是比较晚的吧,不过现在Android 6.0以 ...
- 当web.config文件放置在共享目录下(UNC),启动IIS会提示有错误信息500.19,伴随有错误代码0x80070003和错误代码0x80070005的解决办法
最近遇到一个很有意思的使用环境,操作人员将所有的网站应用内容投放到共享存储里面,并且使用微软的SMB协议将其以CIFS的方式共享出来,使用Windows Server 2008 R2的IIS将其连接起 ...
- gulp初学
原文地址:gulp初学 至于gulp与grunt的区别,用过的人都略知一二,总的来说就是2点: 1.gulp的gulpfile.js 配置简单而且更容易阅读和维护.之所以如此,是因为它们的工作方式不 ...
- 在Visual Studio Code中配置GO开发环境
一.GO语言安装 详情查看:GO语言下载.安装.配置 二.GoLang插件介绍 对于Visual Studio Code开发工具,有一款优秀的GoLang插件,它的主页为:https://github ...
- 基于fis3的组件可视化道路
首先说明一下,即使不熟悉fis3,阅读文本应该也会有所收获. 本文以fis-parser-imweb-tplv2插件为模板插件,目的不在于使用哪个模板,而是组件可视化的实现思路,不必担心. 先说说模板 ...
- 文档对象模型DOM通俗讲解
转自:http://www.jb51.net/article/42671.htm 在开始之前先说一点,DOM是非常容易理解的,但是大家说的太官方,让人很是难于理解,我们就用非常简单的语言翻译一遍.加深 ...