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 设计模式的学习的更多相关文章

  1. C#创建IIS站点及相应的应用程序池,支持IIS6.0+Windows Server 2003. 使用Builder设计模式

    测试项目结构: PS:IIS6UtilsBuilder, IIS7UtilsBuilder,IISUtilsBuilder以及IISDirector为Builder设计模式实现的核心代码.Progra ...

  2. Java调用FFmpeg进行视频处理及Builder设计模式的应用

    1.FFmpeg是什么 FFmpeg(https://www.ffmpeg.org)是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.它用来干吗呢?视频采集.视频格式转化.视频 ...

  3. Builder设计模式--改善构造器多个参数时可显著改善可读性

    作为一名程序开发者,设计模式其实一直有在接触,只是没有专门的去学过,所以可能对设计模式没有一个系统的理解.在一次项目中,需要使用到第三方服务商提供的功能,为了尽快的熟悉其功能代码,在官网下了demo来 ...

  4. 《Head first设计模式》学习笔记 – 迭代器模式

    <Head first设计模式>学习笔记 – 迭代器模式 代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 爆炸性新闻:对象村餐厅和对象村煎饼屋合并了!真是个 ...

  5. 设计模式C++学习笔记之十(Builder建造者模式)

      建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.一段晦涩难懂的文字,实现创建不同表示的方法就是给创建的过程传入创建的参数.详细的还是看代码吧. 10.1.解释 ...

  6. 《设计模式》学习&理解&总结

    教程地址:http://www.runoob.com/design-pattern/design-pattern-tutorial.html 教程书籍:<Android 设计模式解析与实战> ...

  7. 设计模式总结(《Head First设计模式》学习总结)

    写在前面: 学习过程中不仅要熟练掌握技能,理论的消化吸收也必不可少.虽然个人更倾向于学习技术类的东西(短时间的精力投入很快就能看到成效...),但看了很多前辈的经验总结后才知道理论性的东西是绝对不能忽 ...

  8. Java设计模式(学习整理)---命令模式

    设计模式之Command(学习整理) 1.Command定义 不少Command模式的代码都是针对图形界面的,它实际就是菜单命令,我们在一个下拉菜单选择一个命令时,然后会执行一些动作. 将这些命令封装 ...

  9. 《Android源码设计模式》学习笔记之ImageLoader

    微信公众号:CodingAndroid cnblog:http://www.cnblogs.com/angel88/ CSDN:http://blog.csdn.net/xinpengfei521 需 ...

随机推荐

  1. 【文文殿下】【BZOJ4804】欧拉心算

    题解 显然有 \(ans=\sum _{i=1} ^{n} \lfloor \frac{n}{i} \rfloor \sum _{d|i} \mu(d) \phi (\frac{i}{d})\) 前半 ...

  2. ES6字符串相关扩展

    变量的解构赋值 // 数组的解构赋值 let [a,b,c] = [1,2,3]; //1,2,3 let [a,b,c] = [,123,]; //undefined 123 undefined l ...

  3. Android studio 安装的安装若干问题

    1.在国内如何更新android sdk? 由于众所周知的某些原因,我们无法直接连接android sdk的更新服务更新sdk,所以可以通过国内的ftp站点把常用的sdk组件如android plat ...

  4. Unity 使用有限状态机 完美还原 王者荣耀 虚拟摇杆

    Unity 使用有限状态机 完美还原 王者荣耀 虚拟摇杆 效果如图所示 摇杆的UI组成 如图所示 简单的可以认为摇杆由1.2.3贴图组成 为摇杆的底座 为摇杆的杆 为摇杆的指向 可以理解这就是街机上的 ...

  5. Xcode 9 Analyzing Crash Reports

    Analyzing Crash Reports After you distribute your app for testing by using TestFlight or after you m ...

  6. Oracle sys或者system的默认密码

    Oracle的sys和system默认密码   system默认:manager sys默认:change_on_install 使用SQL Plus登录数据库时,system使用密码manager可 ...

  7. 获取dictionary 值连续相同的索引,

    ; i < ;) { , i]; var rangType = companyScheme[i]; string txtCell = ""; switch (rangType ...

  8. Java之集合(二十五)ConcurrentHashMap

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7520808.html 1.前言 本章介绍使用的最频繁的并发集合类之一ConcurrentHashMap,之前介绍 ...

  9. Android 开发工具类 24_getHtml

    获取网页(JSP)源码 import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; impo ...

  10. Python -- Windows编程 -- 注册表

    1.查询开机自启项 startUp.py import re import win32api, win32con def GetValues(fullname): #分割出基本项name[0] nam ...