Builder 设计模式的学习
Buileder(生成器)—对象创建型模式
一 意图
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
二 适用性
在以下情况使用Build模式:
1 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2 当构造过程必须允许被构造的对象有不同的表示时。
3 Builder模式要解决的也正是这样的问题:
当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成),
我们要复杂对象的创建过程和这个对象的表示(展示)分离开来,
这样做的好处就是通过一步步的进行复杂对象的构建,
由于在每一步的构造过程中可以引入参数,使得经过相同的步骤创建最后得到的对象的展示不一样。
在书中第一个例子RTF文档阅读器的实现中,可以看到文档RTFReader支持。

从此图中可以看到:
1封装了三种复杂对象的构建:
ASCIIText,TeXText,TextWiWdget,分别对应不同的builder
2 同样的创建过程创建不同的表示
可以在RTFReader中对文档进行解析的时候while循环,对于同样的文档,使用不同builder创建产品,同样过程可以得到不同的表示。
3 复杂对象构建分过程进行
在while循环中,可以看到对不同类型的文档构件,处理的方式不同。分成不同的部分进行处理。
三 结构图

四 交互过程

Director:是构造一个使用Builder接口的对象
Client创建Director对象,并用它所想要的Builder对象进行配置。
Director创建和装配对象过程
五 实例分析

在这个例子中:VcpTextView支持以下几种显示方式:
UnicodeText,RichText,IconObject,CoustomObject。
每一种之间都是独立不可替换的,相对具有比较复杂的算法。
在显示的时候使用VcpTextBasicLayout来导向装配显示各元素。
但是在大多数实际应用中很多情况,不可能完全的找出书中所描述的情形,
大多数只是在某一部分是符合Builder模式。
六 分析总结
效果:
1 隐藏产品的内部表示
Builder提供创建产品的接口给Director,
隐藏了产品的内部结构(仅提供接口BuildPart()创建产品)
隐藏该产品是如何装配的(BuildPart()内部装配是隐藏的)。
2 将构造代码和表示代码分开
构造代码是在Builder提供的接口中完成的,每个ConcreateBuilder包含了创建和装配一个特定产品的所有代码。
提供不同的Builder,使用相同的Director导向过程可以得到不同的表示。
使用的不同Client可以使用相同的Builder,得到不同相同的表示。
在前面RTFReader阅读器的例子中:
如果提供ASCIIText Converter 则只能得到ASCIIText,提供TexText Converter则可以得到TexText。
如果使用XMLReader,提供ASCIIText Converter 使用Director得到不同于的ASCIIText的表示。
所以将构造代码和表示代码分开,可以使代码得到重用。
3 精确的控制导向产品的创建
将代码的构建过程委托为Director去完成,那么Client可以不用关注产品的构建过程
何时完成或者完成到什么程度,交给Director去控制产品的创建和装配的过程。并返回所创建的产品,或者通知Client。
在实际的使用情况中可能都并非如此,大多数只能在某些部分匹配Builder模式。
推荐一篇关于Builder模式文章阐述的不错:
http://www.cnblogs.com/happyhippy/archive/2010/09/01/1814287.html
Builder 设计模式的学习的更多相关文章
- C#创建IIS站点及相应的应用程序池,支持IIS6.0+Windows Server 2003. 使用Builder设计模式
测试项目结构: PS:IIS6UtilsBuilder, IIS7UtilsBuilder,IISUtilsBuilder以及IISDirector为Builder设计模式实现的核心代码.Progra ...
- Java调用FFmpeg进行视频处理及Builder设计模式的应用
1.FFmpeg是什么 FFmpeg(https://www.ffmpeg.org)是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.它用来干吗呢?视频采集.视频格式转化.视频 ...
- Builder设计模式--改善构造器多个参数时可显著改善可读性
作为一名程序开发者,设计模式其实一直有在接触,只是没有专门的去学过,所以可能对设计模式没有一个系统的理解.在一次项目中,需要使用到第三方服务商提供的功能,为了尽快的熟悉其功能代码,在官网下了demo来 ...
- 《Head first设计模式》学习笔记 – 迭代器模式
<Head first设计模式>学习笔记 – 迭代器模式 代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 爆炸性新闻:对象村餐厅和对象村煎饼屋合并了!真是个 ...
- 设计模式C++学习笔记之十(Builder建造者模式)
建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.一段晦涩难懂的文字,实现创建不同表示的方法就是给创建的过程传入创建的参数.详细的还是看代码吧. 10.1.解释 ...
- 《设计模式》学习&理解&总结
教程地址:http://www.runoob.com/design-pattern/design-pattern-tutorial.html 教程书籍:<Android 设计模式解析与实战> ...
- 设计模式总结(《Head First设计模式》学习总结)
写在前面: 学习过程中不仅要熟练掌握技能,理论的消化吸收也必不可少.虽然个人更倾向于学习技术类的东西(短时间的精力投入很快就能看到成效...),但看了很多前辈的经验总结后才知道理论性的东西是绝对不能忽 ...
- Java设计模式(学习整理)---命令模式
设计模式之Command(学习整理) 1.Command定义 不少Command模式的代码都是针对图形界面的,它实际就是菜单命令,我们在一个下拉菜单选择一个命令时,然后会执行一些动作. 将这些命令封装 ...
- 《Android源码设计模式》学习笔记之ImageLoader
微信公众号:CodingAndroid cnblog:http://www.cnblogs.com/angel88/ CSDN:http://blog.csdn.net/xinpengfei521 需 ...
随机推荐
- netstat 查看本机开放端口
root@kali:~# netstat -luntp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Add ...
- PHP之旅8 URL与表单
表单 表单的出现让用户和后台主机有了直接的交互,网站开始变的‘动态起来’,在HTML的各个标记符中,与PHP关系最为紧密的要属表单标记符了,常见的表单标记符有<form>.<inpu ...
- 一对一关联查询注解@OneToOne的实例详解
表的关联查询比较复杂,应用的场景很多,本文根据自己的经验解释@OneToOne注解中的属性在项目中的应用.本打算一篇博客把增删改查写在一起,但是在改的时候遇到了一些问题,感觉挺有意思,所以写下第二篇专 ...
- iOS开发总结——协议代理的认识
1.前言 自今年5月底正式转iOS之后,天天get新技能,很多技能在脑子里回旋不吐不快,所以,写点东西整理一下.先从协议代理开始. 2.协议方法的声明 @protocol EventMenuBarDe ...
- 剑指offer六十之按之把二叉树打印成多行
一.题目 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行.二.思路 队列LinkedList完成层序遍历,用end记录每层结点数目 三.代码 import java.util.Arra ...
- JavaScript中的异步操作
什么是异步操作? 异步模式并不难理解,比如任务A.B.C,执行A之后执行B,但是B是一个耗时的工作,所以,把B放在任务队列中,去执行C,然后B的一些I/O等返回结果之后,再去执行B,这就是异步操作. ...
- cat /proc/sys/net/ipv4/ip_forward 0 解决办法
[root@localhost java]# cat /proc/sys/net/ipv4/ip_forward 出于安全考虑,Linux系统默认是禁止数据包转发的. 所谓转发即当主机拥有多于一块的网 ...
- ActiveMQ-在Centos7下安装和安全配置
环境准备: JDK1.8 ActiveMQ-5.11 Centos7 1.下载Linux版本的ActiveMQ: $ wget http://apache.fayea.com/activemq/5.1 ...
- linux 命令 后台运行
转载 1.在下达的命令后面加上&,就可以使该命令在后台进行工作,这样做最大的好处就是不怕被ctrl+c这个中断指令所中断. 2. 那大家可能又要问了,在后台执行的程序怎么使它恢复到前台来运行呢 ...
- 查看LINUX 系统硬件等详细信息
转载这位朋友[地址] 几个cpu more /proc/cpuinfo |grep "physical id"|uniq|wc -l 每个cpu是几核(假设cpu配置相同) mor ...