将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。
1、基本建造者模式
建造者模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。如果用了建造者模式,那么用户只需指定需要建造的类型就可以得到它们,而具体建造的过程和细节就不需要知道了。
public class Product
{
IList<string> parts = new List<string>();
//添加产品部件
public void Add(string part)
{
parts.Add(part);
}
public void Show()
{
//列举所有产品部件
Console.WriteLine("\n 产品 创建 ----");
foreach (string part in parts)
{
Console.WriteLine(part);
}
}
}
{
IList<string> parts = new List<string>();
//添加产品部件
public void Add(string part)
{
parts.Add(part);
}
public void Show()
{
//列举所有产品部件
Console.WriteLine("\n 产品 创建 ----");
foreach (string part in parts)
{
Console.WriteLine(part);
}
}
}
//抽象类,确定产品由两个部件组成,并声明一个得到产品的方法GetResult
public abstract class Builder
{
public abstract void BuildPartA();
public abstract void BuildPartB();
public abstract Product GetResult();
}
public abstract class Builder
{
public abstract void BuildPartA();
public abstract void BuildPartB();
public abstract Product GetResult();
}
public class ConcreteBuilder:Builder
{
//为产品建造具体的部件,该类可以有多个
private Product product = new Product();
public override void BuildPartA()
{
product.Add("部件A");
}
public override void BuildPartB()
{
product.Add("部件B");
}
public override Product GetResult()
{
return product;
}
}
{
//为产品建造具体的部件,该类可以有多个
private Product product = new Product();
public override void BuildPartA()
{
product.Add("部件A");
}
public override void BuildPartB()
{
product.Add("部件B");
}
public override Product GetResult()
{
return product;
}
}
public class Director
{
public void Construct(Builder builder)
{
//指挥建造过程,即定义流程或建造顺序等
builder.BuildPartA();
builder.BuildPartB();
}
}
{
public void Construct(Builder builder)
{
//指挥建造过程,即定义流程或建造顺序等
builder.BuildPartA();
builder.BuildPartB();
}
}
static void Main(string[] args)
{
Director director = new Director();
Builder builder = new ConcreteBuilder();
//director用ConcreteBuilder方法来建造产品,当要采用不同的方法来建造产品时,只需要增加一个ConcreteBuilder类
director.Construct(builder);
Product product = builder.GetResult();
product.Show();
Console.Read();
}
{
Director director = new Director();
Builder builder = new ConcreteBuilder();
//director用ConcreteBuilder方法来建造产品,当要采用不同的方法来建造产品时,只需要增加一个ConcreteBuilder类
director.Construct(builder);
Product product = builder.GetResult();
product.Show();
Console.Read();
}
这里builder定义流程需要哪些步骤,concreteBuilder定义这些步骤的具体实现方法,director定义这些步骤的实现顺序。调用时只需将实现方法和实现步骤定义好后就可以实现完整的流程了。
2、适用范围
当创建复杂对象的算法应该独立于该对象的组成部分(concreteBuilder)以及它们的装配方式(director)时。