概述:
建造者模式(Builder):將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
使用場合:
1.當建立複雜物件的演算法應該獨立於該對象的組成部分及他們的裝配方式時。
2.當構造過程必須允許被構造的對象有不同的表示時。
類圖:
代碼結構執行個體:
1.具體的產品類,即我們要製造的產品
/// <summary>
/// 具體的產品類,由多個組件組成
/// </summary>
class Product
{
IList<string> parts = new List<string>();
/// <summary>
/// 添加產品組件
/// </summary>
public void Add(string part)
{
parts.Add(part);
}
public void Show()
{
Console.WriteLine("\n 產品 建立----");
foreach(string part in parts)
{
Console.WriteLine(part);
}
}
}
2.建造產品的抽象類別,定義了怎麼建造這個產品的方法和產生出來的結果,但是不負責具體建造
/// <summary>
/// 抽象建造者類,確定產品由PartA和PartB組成,並聲明一個得到產品建造結果的方法GetResult()
/// </summary>
abstract class Builder
{
public abstract void BuilderPartA();
public abstract void BuilderPartB();
public abstract Product GetResult();
}
3.具體建造類,實現抽象類別的所有方法,按照抽象的設計來完成產品的建造和出廠過程,但是可以可以根據不同的客戶需求
選用不同的配件,實現產品製造這個過程。下面是兩條不同的產品製造過程,製造出同一類產品。
/// <summary>
/// 具體建造者類
/// </summary>
class ConcreteBuilder1:Builder
{
private Product product = new Product();
public override void BuilderPartA()
{
product.Add("組件A");
}
public override void BuilderPartB()
{
product.Add("組件B");
}
public override Product GetResult()
{
return product;
}
}
/// <summary>
/// 具體建造者類
/// </summary>
class ConcreteBuilder2:Builder
{
private Product product = new Product();
public override void BuilderPartA()
{
product.Add("組件X");
}
public override void BuilderPartB()
{
product.Add("組件Y");
}
public override Product GetResult()
{
return product;
}
}
4.有了產品規格,製造流程圖,製造車間,還缺一個負責調度的傢伙,他來操作製造的機器,但是結果是具體的機器吐出來的產品,所以這個傢伙只管閉著眼睛造就行了。
/// <summary>
/// 指揮者類
/// </summary>
class Director
{
public void Construct(Builder builder)
{
builder.BuilderPartA();
builder.BuilderPartB();
}
}
5.用戶端調用,開始造吧
/// <summary>
/// 測試建造者模式
/// </summary>
static void TestBuilder()
{
//指揮者到現場來了
Director director = new Director();
//機器1開啟,熱身
Builder b1 = new ConcreteBuilder1();
//機器2開啟,熱身
Builder b2 = new ConcreteBuilder2();
//指揮者用 ConcreteBuilder1來建立產品
director.Construct(b1);
//產品就這樣從ConcreteBuilder1的pp裡出來了
Product p1 = b1.GetResult();
//放到案頭上就能看見了
p1.Show();
//指揮者用 ConcreteBuilder2來建立產品
director.Construct(b2);
//產品就這樣從ConcreteBuilder2的pp裡出來了
Product p2 = b2.GetResult();
//放到案頭上就能看見了
p2.Show();
Console.Read();
}
小結:
如果你在構造一個複雜的東西(對象)的時候,最好把調度者,建造藍圖,產品規格,建造機器都分開來,這像一個製造流程,但是如果你只需要製作一個手工藝品例如摺紙,那就算了。