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