建造者模式就是將一個複雜物件的構造與它的表示分離,使同樣的構建過程可以建立不同的表示。
適用範圍:
- 當建立複雜物件的演算法應該獨立於該對象的組成部分以及它們的裝配方式時。
- 當構造過程必須允許被構造的對象有不同表示時。
建造者模式裡面有四個角色:
- Builder: 給出一個抽象介面,以規範產品對象的各個組成部分的建造。一般而言,此介面獨立於應用程式的商務邏輯。模式中直接建立產品對象的具體建立者角色。具體建立者角色必須實現這個介面的所有方法:一個是建造方法,另一個是結果返還方法。
- ConcreteBuilder:擔任這個角色的是與應用程式緊密相關的類,它們在應用程式調用下建立產品執行個體。這個角色主要完成的任務包括:實現Builder角色提供的介面,一步一步完成建立產品執行個體的過程。在建造過程完成後,提供產品的執行個體。
- Director:擔任這個角色的類調用具體建造者以建立產品對象。指導者角色並沒沒用產品類的具體知識,真正擁有產品類的具體知識的是具體建造者對象。
- Product: 表示被構造的複雜物件。ConcreteBuilder建立該產品的內部表示並定義它的裝配過程,包含定義組成組件的類,包括將這些組件裝配成最終產品的介面。
具體實現代碼如下:
public class Client
{
public void Test()
{
Director d = new Director();
IBuilder b1 = new ConcreteBuilder1();
IBuilder b2 = new ConcreteBuilder2();
d.Construct(b1);
Product p1 = b1.GetResult();
p1.ShowResult();
d.Construct(b2);
Product p2 = b2.GetResult();
p2.ShowResult();
}
}
public class Director
{
public void Construct(IBuilder builder)
{
builder.BuildPartA();
builder.BuildPartB();
}
}
public interface IBuilder
{
void BuildPartA();
void BuildPartB();
Product GetResult();
}
public class ConcreteBuilder1 : IBuilder
{
private Product product;
public ConcreteBuilder1()
{
this.product =new Product();
}
public void BuildPartA()
{
product.Add("PartA");
}
public void BuildPartB()
{
product.Add("PartB");
}
public Product GetResult()
{
return product;
}
}
public class ConcreteBuilder2 : IBuilder
{
private Product product;
public ConcreteBuilder2()
{
this.product = new Product();
}
public void BuildPartA()
{
product.Add("PartX");
}
public void BuildPartB()
{
product.Add("PartY");
}
public Product GetResult()
{
return product;
}
}
public class Product
{
List<string> lst = new List<string>();
public void Add(string part)
{
lst.Add(part);
}
public void ShowResult()
{
foreach (string part in lst)
{
Console.WriteLine(part);
}
}
}
實現要點:
1. 建造者模式主要用於“分步驟構建一個複雜的對象”,在這其中“分步驟”是一個穩定的演算法,而複雜物件的各個部分則經常變化。
2. 產品不需要抽象類別,特別是由於建立對象的演算法複雜而導致使用此模式的情況下或此模式應用於產品的產生過程,其最終結果可能差異很大,不大可能提煉出一個抽象產品類。
3. 建立者中的建立子組件的介面方法不是抽象方法而是空方法,不進行任何操作,具體的建立者只需要覆蓋需要的方法就可以。
4. 抽象原廠模式解決“系列對象”的需求變化,而Builder模式解決“對象部分”的需求變化,建造者模式常和組合模式(Compsite Pattern)結合使用。
效果
- 建造者模式的使用使得產品的內部表象可以獨立的變化。使用建造者模式可以使用戶端不必知道產品內部組成的細節。
- 每一個Builder都相對獨立,而與其它的Builder無關。
- 可使對構造過程更加精細控制。
- 將構建代碼和表示代碼分開。
- 建造模式的缺點在於難於應付“分步驟構建演算法”的需求變動。
適用性:
以下情況應當使用建造者模式:
- 需要生產的產品對象有複雜的內部結構
- 需要生產的產品對象的屬性相互依賴,建造者模式可以強迫產生順序
- 在對象建立過程中會使用到系統中的一些其它對象,這些對象在產品對象的建立過程中不容易得到。