设计模式 3.2 Builder(生成器)对象创建型模式

   1.意图

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

  2.动机

  一个RTF(Rich Text Format)文档交换格式的阅读器应该将RTF转换为多种正文格式。一种解决办法是用一个可以将RTF转化成另一种正文表示的TextConverter对象配置这个RTFReader类。当RTFReader对RTF文档进行语法分析时,它使用TextConverter去做转换。无论何时RTFReader识别了一个RTF标记(或是普通正文或是RTF控制字),它都发送一个请求给TextConverter去转换成这个标记。TextConverter对象复杂精细数据转换以及用特定格式表示标记。TextConvert的子类对不同转换和不同格式进行特殊处理。每种转换器类将创建和装配一个复杂对象的机制隐含在抽象接口的后面。转换器对立与阅读器,阅读器负责对一个RTF文档进行语法分析。

  Builder模式描述了所有这些关系。每一个转换器类在该模式中被称为生成器(Builder),而阅读器则称为导向器(dirctor)。 在上面的这个例子中,Builder模式将分析文本格式的算法与描述怎样创建和表示一个转换后格式的算法分离开来。这使我们可以重用RTFReader的语法分析算法,根据RTF文档创建不同的正文表示--仅需使用不同的TextConverter的子类配置该RTFReader即可。

  3.适用性

  当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时

  当构造过程必须允许被构造的对象有不同的表示时。

  4,结构

  这个模式的结构为:

  

  5.参与者

  •   Builder(TextConverter) 为创建一个Product对象的各个部分指定抽象接口。
  • ConcreteBuilder 实现Builder的接口以构造和装配该产品的各个部分,定义并明确它所创建的表示,提供一个检索产品的接口
  • Director 构造一个使用Builder即可的对象
  • Product 表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

  6.协作 

  • 客户创建Dircector对象,并用它所想要的Builder对象进行配置。
  • 一旦产品部件被生成,导向器就会通知生成器。
  • 生成器处理导向器的请求,并将部件添加到该产品中。
  • 客户从生成器中检索产品

  7.效果

  • 她使你可以改变一个产品的内部表示  Builder对象提供给导向器一个构造产品的抽象接口。该接口使得生成器可以隐藏这个产品的表示和内部结构。塔筒是也隐藏了该产品是如何装配的。因为i产品是通过抽象接口构造的,你在改变该产品的内部表示时所要做的只是定义一个新的生成器。
  • 它将构造代码和表示代码分开  Builder模式通过封装一个复杂对象的创建和表示方式提高了对象的模块性。
  • 它使你可对构造过程进行更精细的控制 Builder模式与一下子就生成产品的创建型模式不同,它是在导向者的控制下一步一步构造产品的

  8.实现

  通常有一个抽象的Builder类为导向者可能要求创建的没一个构件定义一个操作。这些操作缺省情况下什么都不做。一个ConcreteBuilder类对它又兴趣创建的构件重定义这些操作。

  •   装配和构造接口  生成器逐步的构造它们的产品。因此Builder类接口必须足够普遍,以便为各种类的具体生成器构造产品。
  • 为什么产品没有抽象类  通常情况下,由具体生成器生成的产品,它们表示相差是如此之大以至于给不同的产品以公共父类没有太大意思。
  • 在Builder中缺省的方法为空

  9.代码实现,我们还是改造前面的迷宫游戏,为迷宫游戏添加一个类MazeBuilder的生成器对象。把它作为参数传递给我们定义的CreateMzae成员函数的变体

  10.已知应用

  11.相关模式  Abstract Factory与Builder相似,因为他们都才可以创建复杂对象。主要的区别是Builder模式着重于一步步构造一个负责对象,而Abstract Factory着重于多个系列的产品对象。Builder在最后的一部返回残片,而对于Abstract Factory来说,产品是立即返回的。

代码下载:Builder_MazeGame.rar

原文地址:https://www.cnblogs.com/lufangtao/p/2470969.html