一 意图
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
二 适用性
在以下情况使用Build模式:
1 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2 当构造过程必须允许被构造的对象有不同的表示时。
3 Builder模式要解决的也正是这样的问题:
当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成),
我们要复杂对象的创建过程和这个对象的表示(展示)分离开来,
这样做的好处就是通过一步步的进行复杂对象的构建,
由于在每一步的构造过程中可以引入参数,使得经过相同的步骤创建最后得到的对象的展示不一样。
在书中第一个例子RTF文档阅读器的实现中,可以看到文档RTFReader支持。

从此图中可以看到:
1封装了三种复杂对象的构建:
ASCIIText,TeXText,TextWiWdget,分别对应不同的builder
2 同样的创建过程创建不同的表示
可以在RTFReader中对文档进行解析的时候while循环,对于同样的文档,使用不同builder创建产品,同样过程可以得到不同的表示。
3 复杂对象构建分过程进行
在while循环中,可以看到对不同类型的文档构件,处理的方式不同。分成不同的部分进行处理。
三 结构图
四 交互过程
四个参与者的解释:
- Builder(TextConverter)
------为创建一个Product对象的各个部件指定抽象接口。
- ConcreteBuilder(ASCIIConverter,TexConverter,TextWidgetConverter)
----实现Builder的接口以及构造和装配该产品的各个部件。
----定义并且明确它所创建的表示
----提供一个检索产品的接口(例如,GetASCIIText 和GetTextWidget)
- Director(RTFReader)
----是构造一个使用Builder接口的对象
- Product(ASCIIText,TexText,TextWidget)
----表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程
----包含定义组成部件的类,包括将这些部件装配成最终产品的接口
转载:http://www.cnblogs.com/bastard/archive/2011/11/21/2257625.html
4个角色:指挥者(Director),建造者(Builder),具体建造者(ConcreteBuilder),产品(Product)
产品:需要创建的对象产品
具体建造者:创建产品的实例并且实现建造者多个方法对产品进行装配
建造者:本质为抽象类,里面的抽象方法供具体建造者重写,声明产品的引用
指挥者:调用建造者抽象类以及其方法
实现思路:客户端创建一个指挥者,并且实例化需要的产品的具体建造者,然后指挥者调用具体建造者的实例即将产品生产出来。
类图:
应用场景:在Silverlight中我们需要生产一列多行的输入框+TextBlock的组合,但是这些输入框的类型不同,有一些只能输入256个字符,有的只能输入20个字符,还有的是多行的,有的是单行的输入框。这些输入框的种类是固定的,但是可能用户自定义输入框的时候我们生成的顺序和各自的生成数量不知道。
分析:在这里产品是固定的,有A,B,C,D,E,F六种输入框+TextBlock,用户可能生成的情况是A,A,C,C,B,B,C、也可能是B,C,D,B,C,F。这里我们使用建造者模式,这几种输入框基本上都差不多,都是TextBlock+TextBox的模式。但是可输入数量和是否多行是不定的,那么我们实现AConcreteBuilder,BConcreteBuilder,CConcreteBuilder,DConcreteBuilder,EConcreteBuilder,FConcreteBuilder等多个具体建造者,然后对于建造者中只需要两个方法分别实例化产品,并且对产品的属性(可输入字符数、是否可多行)进行设置,然后再用户需要调用什么产品的时候,使用指挥者调用想要的ConcreteBuilder具体建造者即可。
下面我们以一个电脑产品生产的实例来具体看看Builder Pattern是如何使用的:
一、产品角色
// 产品
public class Computer
{
private string m_CompName;
private string m_MemorySize;
private string m_DiskSize;
/// <summary>
/// 电脑名称
/// </summary>
public string CompName
{
get { return m_CompName; }
set { m_CompName = value; }
}
/// <summary>
/// 内存大小
/// </summary>
public string MemorySize
{
get { return m_MemorySize; }
set { m_MemorySize = value; }
}
/// <summary>
/// 硬盘大小
/// </summary>
public string DiskSize
{
get { return m_DiskSize; }
set { m_DiskSize = value; }
}
/// <summary>
/// 显示产品的信息
/// </summary>
public void ShowComputerInfo()
{
Console.WriteLine( " ------------------------ " );
Console.WriteLine( " 电脑名称: " + CompName);
Console.WriteLine( " 内存大小: " + MemorySize);
Console.WriteLine( " 硬盘大小: " + DiskSize);
}
}
二、建造者角色
// 建造者 定义建造产品的抽象方法和产品的引用
public abstract class ComputerBuilder
{
private Computer computerInstance;
/// <summary>
/// 返回建立的电脑产品实例
/// </summary>
public Computer ComputerInstance
{
get { return computerInstance; }
set { computerInstance = value; }
}
/// <summary>
/// 创建电脑名称
/// </summary>
abstract public void CreateCompName();
/// <summary>
/// 创建电脑内存
/// </summary>
abstract public void CreateCompMemory();
/// <summary>
/// 创建电脑硬盘
/// </summary>
abstract public void CreateCompDisk();
}
三、具体建造者角色
// 具体建造者创建苹果电脑
public class AppleConcreteBuilder : ComputerBuilder
{
public override void CreateCompName()
{
ComputerInstance = new Computer();
ComputerInstance.CompName = " 苹果电脑 " ;
}
public override void CreateCompMemory()
{
ComputerInstance.MemorySize = " 4G " ;
}
public override void CreateCompDisk()
{
ComputerInstance.DiskSize = " 500G " ;
}
}
// 具体建造者创建戴尔电脑
public class DellConcreteBuilder : ComputerBuilder
{
public override void CreateCompName()
{
ComputerInstance = new Computer();
ComputerInstance.CompName = " 戴尔电脑 " ;
}
public override void CreateCompMemory()
{
ComputerInstance.MemorySize = " 2GB " ;
}
public override void CreateCompDisk()
{
ComputerInstance.DiskSize = " 320GB " ;
}
}
// 具体建造者创建惠普电脑
public class HpConcreteBuilder : ComputerBuilder
{
public override void CreateCompName()
{
ComputerInstance = new Computer();
ComputerInstance.CompName = " 惠普电脑 " ;
}
public override void CreateCompMemory()
{
ComputerInstance.MemorySize = " 1GB " ;
}
public override void CreateCompDisk()
{
ComputerInstance.DiskSize = " 160GB " ;
}
}
// 具体建造者创建IBM电脑
public class IBMConcreteBuilder : ComputerBuilder
{
public override void CreateCompName()
{
ComputerInstance = new Computer();
ComputerInstance.CompName = " IBM电脑 " ;
}
public override void CreateCompMemory()
{
ComputerInstance.MemorySize = " 2G " ;
}
public override void CreateCompDisk()
{
ComputerInstance.DiskSize = " 1000G " ;
}
}
四、指挥者角色
// 指挥者
public class CreateDirector
{
/// <summary>
/// 调用建造者抽象方法以生产产品
/// </summary>
/// <param name="compBuilder"></param>
public void CreateComputer(ComputerBuilder compBuilder)
{
compBuilder.CreateCompName();
compBuilder.CreateCompMemory();
compBuilder.CreateCompDisk();
}
}
最后调用使用的示例如下:
namespace BuilderPattern
{
class Program
{
static void Main(string[] args)
{
//创建指挥者
CreateDirector compDirector = new CreateDirector();
//创建具体建造者
ComputerBuilder hpComputer = new HpConcreteBuilder();
ComputerBuilder ibmComputer = new IBMConcreteBuilder();
ComputerBuilder dellComputer = new DellConcreteBuilder();
ComputerBuilder appleComputer = new AppleConcreteBuilder();
//指挥者调用具体建造者以创建产品
compDirector.CreateComputer(hpComputer);
//调用产品内部函数显示产品信息
hpComputer.ComputerInstance.ShowComputerInfo();
compDirector.CreateComputer(ibmComputer);
ibmComputer.ComputerInstance.ShowComputerInfo();
compDirector.CreateComputer(dellComputer);
dellComputer.ComputerInstance.ShowComputerInfo();
compDirector.CreateComputer(appleComputer);
appleComputer.ComputerInstance.ShowComputerInfo();
Console.ReadLine();
}
}
}
转载:http://www.cnblogs.com/chengxingliang/archive/2011/07/14/2105119.html