【设计模式基础】创建型模式 - 5 - 生成器(Builder)

1. 模式意图

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


生成器模式使用的对象:

在有些情况下,一个对象会有一些性质:在他么没有恰当的值之前,对象不能作为一个完整的产品使用。例如,一个电子邮件有发件人地址、收件人地址、主题、内容、附件等部分,而在最起码的收件人地址未被赋值之前,这个电子邮件不能发出。

在有些情况下,一个独享的一些性质必须按照某个顺序赋值才有意义。在某个性质没有赋值之前,另一个性质则无法赋值;这些情况使得性质本身的构造涉及到复杂的商业逻辑。

这些时候,此对象相当于一个有待构造的产品,而对象的这些性质则相当于产品的零件,构造产品的过程就是组合零件的过程。

由于组合零件的过程很复杂,因此,这些零件的构造过程往往被外部化到一个成为生成器的对象里,生成器返回给客户端的是一个全部零件都建造完毕的产品对象。


Abstract Factory与Builder模式很相似,因为它也可以创建复杂对象。主要的区别是:Builder模式着重与一步步构造一个复杂对象;而Abstract Factory模式着重于对各系列的产品对象。Builder在最后的一步返回产品;而对于Abstract Factory来说,产品是立即返回的。(Builder模式返回一个最终的产品Product,而组成Product的零件Parts则最为Builder的中间过程不返回给客户端;Abstract Factory模式每次返回的都是某个产品系列中的某一个具体的产品)


2. 模式定义

【设计模式基础】创建型模式 - 5 - 生成器(Builder)_第1张图片

生成器(Builder):给出一个抽象接口,以规范产品对象的各个组成成分的构造。一般而言,此接口独立于应用程序的商业逻辑。

具体生成器(Concrete Builder):实现Builder提供的几口,一步一步完成创建产品的过程;在构造过程完成后,返回产品的接口。

Director: 调用具体生成器以创建产品对象.

Product:产品便是构造中的复杂对象。


Director将客户端创建产品的请求划分为对各个零件的构造请求,在将这些请求委派给具体构造者.具体构造者是做具体构造工作的,但却不为客户端所知.


3. 模式实现

3.1 C#

using System;
using System.Collections;

class Director
{
  public void Construct( Builder builder )
  {
    builder.BuildPartA();
    builder.BuildPartB();
  }
}

abstract class Builder
{
  abstract public void BuildPartA();
  abstract public void BuildPartB();
  abstract public Product GetResult();
}

class ConcreteBuilder1 : Builder
{
  private Product product;
  override public void BuildPartA()
  {
    product = new Product();
    product.Add( "PartA" );
  }

  override public void BuildPartB()
  {
    product.Add( "PartB" );
  }

  override public Product GetResult()
  {
    return product;
  }
}

class ConcreteBuilder2 : Builder
{
  private Product product;
  override public void BuildPartA()
  {
    product = new Product();
    product.Add( "PartX" );
  }

  override public void BuildPartB()
  {
    product.Add( "PartY" );
  }

  override public Product GetResult()
  {
    return product;
  }
}

class Product
{
  ArrayList parts = new ArrayList();
  public void Add( string part )
  {
    parts.Add( part );
  }

  public void Show()
  {
    Console.WriteLine( " Product Parts -------" );
    foreach( string part in parts )
      Console.WriteLine( part );
  }
}

public class Client
{
  public static void Main( string[] args )
  {
    Director director = new Director( );

    Builder b1 = new ConcreteBuilder1();
    Builder b2 = new ConcreteBuilder2();

    director.Construct( b1 );
    Product p1 = b1.GetResult();
    p1.Show();

    director.Construct( b2 );
    Product p2 = b2.GetResult();
    p2.Show();
  }
}


4. 模式应用

在以下情况下使用生成器模式:

  • 需要生成的产品对象有复杂的内部结构
  • 需要生成的产品对象的属性相互依赖,生成器模式可以强迫生成顺序
  • 在对象构造过程中会使用到系统中的一些其他对象,这些对象在产品对象的创建过程中不易得到
  • Composite模式通常是用Builder生成的
  • 生成器模式的使用使得产品的内部表象可以独立的变化;使用生成器模式可以使客户端不必知道产品内部组成的细节
  • 每个Builder都是相对独立,而与其他的Builder无关


4.1 内容转换成不同的文件类型



你可能感兴趣的:(Design,Patterns)