Skip to main content

💡 創造者模式

Builder Pattern

概述

  • 它適用於各式物件都需分開建立的複雜情境
  • 優點:
    • 容易擴充
    • 有一個統一的介面來規範複雜物件的建立
    • 分開了物件的建立過程,讓物件建立過程可以建立不同的組合
  • 缺點:
    • 在需求複雜度增加時,需要更多的類別來建立物件,導致開發與維護成本提高

創造者模式包含

  • 創造者介面 (Builder interface): 規範建立物件所需要的方法
  • 具體創造者 (Concrete Builder): 實作創造者介面的功能
  • 指揮者 (Director): 負責處理建立流程
  • 產品 (Product): 要被建立的物件

範例

  • 需求: 我需要建立一棟房子,房子要有門、有窗、有牆

1. 先定義產品 - 房子

    internal class House
{
/// <summary>
/// 門
/// </summary>
public string Door { get; set; }
/// <summary>
/// 牆
/// </summary>
public string Wall { get; set; }
/// <summary>
/// 窗戶
/// </summary>
public string Window { get; set; }

public override string ToString()
{
return $"房子包含: {Door}{Wall}{Window}";
}
}

2. 定義創造者介面

    internal abstract class Builder
{
public abstract void BuildDoor();
public abstract void BuildWall();
public abstract void BuildWindow();
public abstract House GetProduct();
}

3. 實作創造者介面 - 具體創造者

    internal class ConcreteBuilder : Builder
{
private House _product = new();

public override void BuildDoor()
{
_product.Door = "門";
}

public override void BuildWall()
{
_product.Wall = "牆壁";
}

public override void BuildWindow()
{
_product.Window = "窗戶";
}

public override House GetProduct()
{
return _product;
}
}

4. 建立指揮者

    internal class Director
{
public static void Construct(Builder builder)
{
builder.BuildDoor();
builder.BuildWall();
builder.BuildWindow();
}
}

5. 客戶端使用

Builder builder = new ConcreteBuilder();
Director.Construct(builder);

var house = builder.GetProduct();

Console.WriteLine(house.ToString());

6.結果

  • 輸出:
房子包含: 門、牆壁、窗戶