动机:在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临剧烈的变化,但是将它们组合在一起的算法却相对稳定。
如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求的改变而改变。
意图:就是将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
基本Code:
//房子
public abstract class House
{
}
//门
public abstract class Door
{
}
//墙
public abstract class Wall
{
}
//窗口
public abstract class Windows
{
}
//地板
public abstract class Floor
{
}
//屋顶
public abstract class HouseCeiling
{
}
//罗曼蒂克的房屋
public class RomanDoor:Door
{
}
public class RomanWall:Wall
{
}
public class RomanWindows:Windows
{
}
public class RomanFloor:Floor
{
}
public class RomanHouseCeiling:HouseCeiling
{
}
//建造者模式
public abstract class Builder
{
public abstract void BuildDoor();
public abstract void BuildWall();
public abstract void BuildWindows();
public abstract void BuildFloor();
public abstract void BuilderHouseCeiling();
public abstract House GetHouse();
}
//罗曼蒂克房子
public class RomanHouse:House
{
}
public class RomanHouseBuilder:Builder
{
public override void BuildDoor(){}
public override void BuildWall(){}
public override void BuildWindows(){}
public override void BuildFloor(){}
public override void BuilderHouseCeiling(){}
public override House GetHouse(){}
}
public class GameManager
{
public static House CreateHouse(Builder builder)
{
builder. BuildDoor();
builder. BuildDoor();
builder.BuildWall();
builder.BuildWall();
builder.BuildWindows();
builder.BuildWindows();
builder.BuildFloor();
builder.BuilderHouseCeiling();
builder.GetHouse();
}
}
客户端程序:
public class App
{
public static void Main()
{
/*由于改变了参数我们要修改客户端code,所以我们可以从配置文件中读取//Builder信息,这样的话,我们客户端的Code就不需要做作任何改动*/
String assemblyName=ConfigurationManager.AppSettings["BuilderAssembly"];
String builderName=ConfigurationManager.AppSettings["BuilderName"];
Assembly assembly=Assembly.Load(assemblyName);
Type t=assembly.GetType(builderName);
Builder builder=Activator.CreateInstance(t);
//House house=GameManager.CreateHouse(new RomanBuilder());
House house=GameManager.CreateHouse(builder);
}
}
如果今后修改出现新的房子模式,我们只需要从Builder和House继承产生新的类就可以了,无需改动客户端的Code。
Builder模式的要点
1、 Builder模式主要用于“分布骤构建一个复杂的对象”。这其中的“分步骤”是一个稳定的算法,而复杂对象各个部分经常变化。
2、 变化点在那里,封装那里――Builder主要在于就对“复杂对象”各个部分的频繁需求变动。其缺点难以应对“分步骤构建算法”的变动。
3、 Abstract Factory模式解决“系列对象”的需求变化,Builder模式解决“对象部分”的需求变化。Builder模式经常和Composite模式组合使用。