动机
在软件系统中,有时候面临着一个复杂对象的创建工作,其通常是由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂的对象的各个部分经常面临着剧烈的变化,但是将他们组合在一起的算法却相对稳定。
如何提供一种封装机制来隔离出复杂对象各个部分的变化,从而保持系统中稳定构建算法不随着需求的变化而变化
意图
将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建出不同的表示
在建造者模式结构图中包含如下几个角色:
● Builder(抽象建造者):它为创建一个产品Product对象的各个部件指定抽象接口,在该接口中一般声明两类方法,一类方法是buildPartX(),它们用于创建复杂对象的各个部件;另一类方法是getResult(),它们用于返回复杂对象。Builder既可以是抽象类,也可以是接口。
●ConcreteBuilder(具体建造者):它实现了Builder接口,实现各个部件的具体构造和装配方法,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。
●Product(产品角色):它是被构建的复杂对象,包含多个组成部件,具体建造者创建该产品的内部表示并定义它的装配过程。
● Director(指挥者):指挥者又称为导演类,它负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在其construct()建造方法中调用建造者对象的部件构造与装配方法,完成复杂对象的建造。客户端一般只需要与指挥者进行交互,在客户端确定具体建造者的类型,并实例化具体建造者对象(也可以通过配置文件和反射机制),然后通过指挥者类的构造函数或者Setter方法将该对象传入指挥者类中。
class Product
{
public PartA A { get; set; }
public PartB B { get; set; }
public PartC C { get; set; }
}
class PartA
{ }
class PartB
{ }
class PartC
{ }
abstract class Builder
{
protected Product prod = new Product();
public abstract void BuildPartA();
public abstract void BuildPartB();
public abstract void BuildPartC();
public Product GetResult()
{
return prod;
}
}
class ConcreteBuilder : Builder
{
public override void BuildPartA()
{
prod.A = new PartA();
}
public override void BuildPartB()
{
prod.B = new PartB();
}
public override void BuildPartC()
{
prod.C = new PartC();
}
}
class Director
{
private Builder builder;
public Director(Builder builder)
{
this.builder = builder;
}
public void Construct()
{
builder.BuildPartA();
builder.BuildPartB();
builder.BuildPartC();
}
}
class Program
{
public static void Main()
{
Builder builder = new ConcreteBuilder();
Director director = new Director(builder);
director.Construct();
Product prod = builder.GetResult();
}
}