緣起:某一設施由幾個部分組成,這些部分的組成不變(系統的高層抽象保持穩定),但每個部分要富於變化。
動機(motivation):
“一個複雜物件”的建立工作,通常由各個部分的子物件用一定演算法構成;這些部分經常面臨劇烈的變化,但組合演算法卻相對穩定。
意圖(intent):
將一個複雜物件的構建與其表示相分離,使同樣的構建過程可以建立不同的表示。
結構(Structure):
協作(Collaborations)
應用:
abstract class House
{
}
public abstract class Builder
{
public abstract void BuildDoor();
public abstract void BuildWindows();
public abstract House GetHouse(); //house is made of these elements listed above
}
public class GameManager
{
public static House CreateHouse(Builder builder)
{ //這裡使基本穩定的,即所謂的演算法
builder.BuildDoor();
builder.BuildDoor();
builder.BuildWindows();
return builder.GetHouse();
}
}
public class RomanHouse:House
{
}
public class RomanHouseBuilder: Builder
{
public override void BuildDoor();
public override void BuildWindows();
public override House GetHouse(); //house is made of these elements listed above
}
class App
{
public static void Main()
{ //這樣使變動的
House house = GameManager.CreateHouse(new RomainHouseBuilder);
//在。net中可以利用類型反射,這樣用戶端就不用重新編譯,new RomainHouseBuilder就不用變動了
string assemblyName= ConfigurationSettings[“BuilderAssembly”];
string builderName = ConfigurationSettings[“Builder”];
Assembly assembly = Assembly.Load(assemblyName);
Typy t= assembly.GetType(“builderName”);
Builder builder = Active.CreateInstance(t);
House house = GameManager.CreateHouse(builder);
}
}
要點:
1. BuilderPart方法為虛函數,可返回介面或抽象類別
2. 難以應對“分步驟構建演算法”的需求變動