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

来源:互联网 发布:域名生成二维码 编辑:程序博客网 时间:2024/04/30 15:59

1. 模式意图

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


生成器模式使用的对象:

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

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

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

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


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


2. 模式定义


生成器(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 内容转换成不同的文件类型



0 0