一、建造者模式简介(Brief Introduction)
建造者模式(
Builder Pattern
),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示。
<?XML:NAMESPACE PREFIX = O />
建造者模式的优点是:使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以如要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。
二、解决的问题(What To Solve)
主要用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但是对象内部的构建通常面临着复杂的变化。
三、建造者模式分析(Analysis)
1、建造者模式结构
<?XML:NAMESPACE PREFIX = V />
Product
类
:具体的产品。
Director
类
:指挥者,构建一个使用
Builder
接口的对象。
Builder
接口
:是为创建一个
Product
对象的各个组件指定的抽象接口
ConcreteBuilder
类
:具体的建造者,实现
Builder
接口,构造和装配各个部
2、源代码
1
、具体产品
Product
|
public
class Product
{
private IList<string> parts = new List<string>();
public void Add(string part)
{
parts.Add(part);
}
public void Show()
{
Console.WriteLine("
产品开始创建
......"
);
foreach (string part in parts)
{
Console.WriteLine("
部件
"
+ part);
}
Console.WriteLine("
产品完成创建
"
);
}
}
|
2
、抽象建造者
Builder
及其具体建造者
ConcreteBuilder1
,
ConcreteBuilder2
|
public
abstract class Builder
{
public abstract void BuildPartA();
public abstract void BuildPartB();
public abstract Product GetResult();
}
public
class ConcreteBuilder1 : Builder
{
Product product = new Product();
public override void BuildPartA()
{
product.Add("A1");
}
public override void BuildPartB()
{
product.Add("B1");
}
public override Product GetResult()
{
return product;
}
}
public
class ConcreteBuilder2 : Builder
{
Product product = new Product();
public override void BuildPartA()
{
product.Add("A2");
}
public override void BuildPartB()
{
product.Add("B2");
}
public override Product GetResult()
{
return product;
}
}
|
3
、指挥者类
Director
|
///
<summary>
///
指挥建造过程
///
</summary>
public
class Director
{
public void Construct(Builder builder)
{
builder.BuildPartA();
builder.BuildPartB();
}
StringBuilder
}
|
4
、客户端代码
|
static
void <?XML:NAMESPACE PREFIX = ST1 />Main(string[] args)
{
Director director = new Director();
Builder builder1 = new ConcreteBuilder1();
Builder builder2 = new ConcreteBuilder2();
director.Construct(builder1);
Product product1 = builder1.GetResult();
product1.Show();
director.Construct(builder2);
Product product2 = builder2.GetResult();
product2.Show();
Console.Read();
}
|