1.动机:在软件系统中,有时面临着“一个复杂对象”的创建工作,其通常由各个不忍的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。我们应该提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化。
2.意图:讲一个复杂的对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。《设计模式》GoF
3.要点:主要用于分步骤的构建一个复杂对象。变化点在那里,封装那里,难以应当“分步骤构建算法”。Abstract Factory模式解决“系列对象”的需求变化,Builder模式解决“对象部分”的需求变化
3.实例
//抽象House类
public abstract class House
{
}
public abstract class Door
{
}
public abstract class Windows
{
}
/// <summary>
/// Builder类,封装变化点
/// </summary>
public abstract class Builder
{
//变化的部分
public abstract void BuildDoor();
public abstract void BuildWindows();
public abstract House GetHouse();
}
//CreateHouse依赖与抽象,不依赖与具体
public static House CreateHouse(Builder builder)
{
//比较稳定的
builder.BuildDoor();
builder.BuildDoor();
builder.BuildWindows();
builder.BuildWindows();
return builder.GetHouse();
}
//变化的部分,一种Romain风格
public class RomainHouse:House
{
public RomainHouse()
{
Console.WriteLine("创建了Romain风格的房屋");
}
}
public class RomainDoor : Door
{
}
public class RomainWindows :Windows
{
}
partial class RomainHouseBuilder:Builder
{
public override void BuildDoor()
{
Console.WriteLine("创建的Romain风格的门");
}
public override void BuildWindows()
{
Console.WriteLine("创建的Romain风格的窗");
}
public override House GetHouse()
{
return new RomainHouse();
}
}
//变化的部分,一种Classic风格
class ClassicHouse:House
{
public ClassicHouse()
{
Console.WriteLine("创建了Classic风格的房屋");
}
}
public class ClassicDoor : Door
{
}
public class ClassicWindows : Windows
{
}
partial class ClassicHouseBuilder : Builder
{
public override void BuildDoor()
{
Console.WriteLine("创建的Classic风格的门");
}
public override void BuildWindows()
{
Console.WriteLine("创建的Classic风格的窗");
}
public override House GetHouse()
{
return new ClassicHouse();
}
}
//客户程序
class Test
{
static void Main(string[] args)
{
//Builder对象可以从配置文件中读取
GameManager.CreateHouse(new RomainHouseBuilder());
Console.WriteLine("********************************");
GameManager.CreateHouse(new ClassicHouseBuilder());
}
}