问题聚焦:

        生成器模式是对象创建型模式的一种
        它将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
意图:
正如上面所说,生成器的意图是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
动机:以一个例子解释生成器的动机

Demo:
一个具有格式转换供功能的阅读器应该能将原始的RTF格式转换为多种正文格式。目的格式的种类可以任意类型的,因此要求是要很容易地实现新的转换的增加,同时不改变RTF阅读器。
解决办法:步骤
  1. 使用一个辅助类,来配置这个类(比如是RTFReader),这个辅助类(比如是TextConverter类)可以将原始的RTF格式转换成另一种格式的文本表示;
  2. RTFReader类(又称为导向器)专注于对文档的词法分析,而将每个单词或者符号的转换交给TextConverter;
  3. TextConverter对象(称为生成器)负责对数据进行转换以及用特定格式表示该标记;
  4. TextConvert的子类对不同转换和不同格式进行特殊处理。
目的:重用RTFReader的词法分析算法,根据目的格式的不同,使用不同的TextConverter的子类配置该RTFReader。
设计:

适用性:
在以下情况使用Buider模式
  • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时
  • 当构造过程必须允许被构造的对象有不同的表示时
结构:
参与者:
  • Builder(TextConverter):为创建一个Product对象的各个部件指定抽象接口
  • ConcreteBuilder(ASCIIConverter、TeXConverter、TextWidgetConverter) :   实现Builder的接口以及构造和装配该产品的各个部件; 定义并明确它所创建的表示; 提供一个检索产品的接口
  • Director(RTFReader):构造一个使用Builder接口的对象
  • Product(ASCIIText、TeXText、TextWidget):表示被构建的复杂对象,包含定义组成部件的类,包括将这些部件装配成最终产品的接口
协作:
  • 客户创建Director对象,并用他想要的Builder对象进行配置
  • 一旦产品部件被生成,导向器就会通知生成器
  • 生成器处理导向器的请求,并将部件添加到该产品中
  • 客户从生成器中检索产品
效果:
  • 它使你可以改变一个产品的内部表示:Buidler对象给使用它的导向器提供一个抽象接口,产品是通过这个抽象接口构造的,你在生产一个新的产品时需要定义一个新的生成器
  • 它将构造代码和表示代码分开:Builder模式通过封装一个复杂对象的创建和表示方式提高了对象的模块性
  • 它使你可对构造过程进行更精细的控制:Builder模式与一下子就生成产品的创建型模式不同,它是在导向者的控制下一步一步构造产品。因此可以更好地反映产品的构造过程。
实现:
生成器模式的实现需要考虑下面的几个问题
  • 装配和构造接口:生成器逐步地构造它们的产品,因此Builder类接口必须足够普遍,以便为各种类型的具体生成器构造产品;
  • 产品没有抽象类:各个产品相差很大,所以并没有必要定义一个抽象类继承它;
  • 在Builder中缺省的方法为空:C++中,各个构建的生成方法故意不声明为纯虚成员函数,而是把它们是定义为空方法,这使客户只重定义他们所感兴趣的操作。
代码示例:

依然以创建迷宫为例:
这里我们定义一个CreateMaze成员函数的变体,它以类MazeBuilder的一个生成器对象作为参数。
MazeBuilder类定义如下
class MazeBuilder
{
public:virtual void BuildMaze() {}virtual void BuildRoom(int room) {}virtual void BuildDoor(int roomFrom, int roomTo) {}virtual Maze* GetMaze() { return 0;}
protected:MazeBuilder();
}
以生成器为参数的CreateMaze成员函数版本
Maze* MazeGame::CreateMaze (MazeBuilder& builder)
{builder.BuildMaze();builder.BuildRoom(1);builder.BuildRoom(2);builder.BuildDoor(1,2);return builder.GetMaze();
}
关于生成器的子类对具体的迷宫的实现的代码这里不再贴出,下面演示一下怎样使用一个生成器子类CountingMazeBuilder
int rooms, doors;
MazeGame game;
CountingMazeBuilder builder;game.CreateMaze(builder);
builder.getCounts(rooms, doors);

相关模式
抽象工厂和生成器模式的比较:
共同点:都可以创建复杂对象
区别:
Builder模式着重一步步构造一个复杂对象,这个产品可能在导向器和生成器之间传递很多次,最后返回产品
抽象工厂着重于产品的多个系列,而且产品是在工厂中一次加工好然后返回的,并没有出现产品的半成品返厂的情况出现(这点可以将两个模式的示例代码比较一下,就会有感触)
参考资料:
《设计模式》

设计模式(2) 生成器模式(BUILDER)相关推荐

  1. 二十三种设计模式[3] - 生成器模式(Builder Pattern)

    前言 生成器,又名建造者模式,属于创建型模式.在<设计模式 - 可复用的面向对象软件>一书中对它的描述为" 将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表 ...

  2. 设计模式笔记——生成器模式(Builder Pattern)

    一.概述 在软件系统中,把构造对象实例的逻辑移到了类的外部,在这个类的外部定义了类的逻辑.它把一个复杂对象的构造过程从对象的表示中分离出来了,其直接效果是将一个复杂的对象简化为一个比较简单的目标对象. ...

  3. 2018.3.31 设计模式之生成器模式详解及例子(对象创建型模式)

    设计模式之生成器模式(对象创建型模式) 1.定义/概念 将一个复杂对象的创建和它的表示分离,使得同样的创建过程可以有不同的表示. 2.生成模式角色 Builder: 生成器接口,定义创建一个Produ ...

  4. C#设计模式 之 生成器模式

    C#设计模式 之 生成器模式 一,意图 二,动机 三,结构 四,优缺点 五,应用场景 六,代码实现 别名:建造者模式.Builder 一,意图   将一个复杂的对象的构建与其表示相分离,使得同样的构建 ...

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

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

  6. 研磨设计模式 之 生成器模式(Builder)2 ——跟着cc学设计系列

    8.2  解决方案 8.2.1  生成器模式来解决 用来解决上述问题的一个合理的解决方案就是生成器模式.那么什么是生成器模式呢? (1)生成器模式定义 (2)应用生成器模式来解决的思路 仔细分析上面的 ...

  7. C++设计模式之建造者模式(builder)(创建型)

    软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装.继承.多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累. ...

  8. 生成器模式(Builder)解析例子

    生成器模式属于对象结构型模式,其意图是将一个复杂对象的构建与他的表示分离,使得同样的构建创建过程可以创建不同的表示. 适用性: 1.         当创建复杂对象的算法应该独立于该对象的组成部分以及 ...

  9. JAVA23种设计模式之生成器模式

    生成器模式 生成器模式是一种对象的创建模式,可以将一个复杂产品的内部表象和产品的生产过程分隔开来,(构建与表示分离).使得同样的构建过程可以创建不同的表示. 简单的来说,就是讲一个复杂的对象拆分成一个 ...

  10. Android设计模式之建造者模式builder

    今天小编来说一下Android中的一种设计模式--建造者模式Builder 绪论: 那么对于Android初级来说,Builder设计模式可能在我们开发中用过的很少,但是我们可能见过,我们经常用的Al ...

最新文章

  1. 盘点:2020年最酷的12家机器学习初创公司
  2. 40条优化php代码的小实例
  3. Git_Eclipse:[3]Git初始化工程
  4. 数字预失真技术基本原理
  5. Qt中的QInputDialog
  6. Linux useradd命令
  7. C#中实现js中的eval函数功能
  8. LeetCode 993. 二叉树的堂兄弟节点(层序遍历)
  9. mysql 查询语句属性值_MySQL学习——SQL查询语句(一)
  10. python 输出文字_Python中输出ASCII大文字、艺术字、字符字小技巧
  11. 毕设日志——tensorboardX无法连接的问题
  12. input 输入速度和方向判断、搜索功能的延迟请求
  13. 前后端分离 与 不分离
  14. java servlet深入理解_深入理解 Java Servlet
  15. 7个相同小球4个不同盒子_不会解公考行测的“排列组合题”?掌握这7招,轻松搞定...
  16. MySQL(13)-----多表查询(子查询)
  17. android nfc MifareUltralight读写
  18. android 9坚果r1,坚果R1、小米MIX2S、一加6对比评测 骁龙845旗舰怎么选?
  19. 淘宝天猫x-sign算法
  20. sql 大于 小于 大于等于 小于等于 符号

热门文章

  1. json-server安装报错问题
  2. htmlCSS面试题
  3. Tomcat日志显示乱码问题
  4. 快递鸟电子面单接口流程文档汇总
  5. nodejs下载安装和环境搭建,以及nodejs各个版本如何绿色下载
  6. 4月1日起支付宝、微信扫码支付单日限额500元,够用吗?
  7. 游戏开发需要懂几种语言?
  8. 双非一本考研湖南大学计算机技术初试经验分享
  9. ovito :qt.qpa.plugin: Could not load the Qt platform plugin “xcb“ in ““ even though it was found.
  10. 时间序列--平稳性介绍及检验方法