工廠方法模式(Factory Method Pattern)是一種創建型模式,旨在提供一種方式來創建物件,並隱藏實際創建物件的細節。以下是工廠模式的四個要素:

簡介

  1. 模式名稱

工廠方法模式

  1. 問題

需要一種方式來創建物件,並將創建物件的細節隱藏起來。

  1. 解決方案

使用一個工廠類別來封裝物件的創建邏輯。客戶端只需要提供所需物件的參數,並由工廠類別負責創建物件。

  1. 結果

隱藏了創建物件的細節,使得客戶端可以輕鬆地獲取所需物件。

優點

避免了創建者和產品之間的緊密耦合。

S 單一職責原則。將產品的功能單一化,只需要做自己的任務就好。

O 開放/封閉原則。可以在不修改當前程式碼的情況下將新類型的產品引入。

缺點

程式碼隨著規模將變得越來越複雜

簡單工廠模式(Simple Factory Pattern):

以下我們來用食品工廠當作範例範例,其產品為牛肉麵、拉麵、義大利麵。

public interface IFood
{
    void Make();
}

public class BeefNoodle : IFood
{
    public void Make()
    {
        Console.WriteLine("製作牛肉麵...");
    }
}

public class Ramen : IFood
{
    public void Make()
    {
        Console.WriteLine("製作拉麵...");
    }
}

public class Spaghetti : IFood
{
    public void Make()
    {
        Console.WriteLine("製作義大利麵...");
    }
}

public class FoodFactory
{
    public IFood CreateFood(string foodType)
    {
        switch (foodType.ToLower())
        {
            case "beefnoodle":
                return new BeefNoodle();
            case "ramen":
                return new Ramen();
            case "spaghetti":
                return new Spaghetti();
            default:
                throw new ArgumentException("Invalid food type");
        }
    }
}

public class Client
{
    public void Main()
    {
        FoodFactory factory = new FoodFactory();

        IFood food1 = factory.CreateFood("beefnoodle");
        food1.Make();

        IFood food2 = factory.CreateFood("ramen");
        food2.Make();

        IFood food3 = factory.CreateFood("spaghetti");
        food3.Make();
    }
}

在以上的範例中,簡單工廠模式主要是在 FoodFactory 類別中進行了產品的建立,而客戶端需要透過工廠來取得產品物件。

工廠方法模式(Factory Method Pattern):

public interface IFood
{
    void Make();
}

public class BeefNoodle : IFood
{
    public void Make()
    {
        Console.WriteLine("製作牛肉麵...");
    }
}

public class Ramen : IFood
{
    public void Make()
    {
        Console.WriteLine("製作拉麵...");
    }
}

public class Spaghetti : IFood
{
    public void Make()
    {
        Console.WriteLine("製作義大利麵...");
    }
}

public interface IFoodFactory
{
    IFood CreateFood();
}

public class BeefNoodleFactory : IFoodFactory
{
    public IFood CreateFood()
    {
        return new BeefNoodle();
    }
}

public class RamenFactory : IFoodFactory
{
    public IFood CreateFood()
    {
        return new Ramen();
    }
}

public class SpaghettiFactory : IFoodFactory
{
    public IFood CreateFood()
    {
        return new Spaghetti();
    }
}

public class Client
{
    public void Main()
    {
        IFoodFactory factory1 = new BeefNoodleFactory();
        IFood food1 = factory1.CreateFood();
        food1.Make();

        IFoodFactory factory2 = new RamenFactory();
        IFood food2 = factory2.CreateFood();
        food2.Make();

        IFoodFactory factory3 = new SpaghettiFactory();
        IFood food3 = factory3.CreateFood();
        food3.Make();
    }
}

在以上的範例中,工廠方法模式則是把產品的建立交由工廠子類別來實現,而客戶端只需要透過工廠介面與產品介面來使用產品。

以上是 Factory Method Pattern 的二種不同的實作方式,可以根據不同的需求來選擇適合的方式來實現。

Factory Method Pattern的重點整理:

  1. 工廠方法模式是一種創建型設計模式,它可以將對象的創建過程封裝在一個工廠中,使得客戶端不需要知道如何創建對象。

  2. 工廠方法模式通常包含一個抽象工廠類別和多個具體工廠類別,每個具體工廠類別負責創建一種產品。

  3. 工廠方法模式的核心是工廠方法,這個方法用於創建對象,並且返回創建的對象給客戶端使用。

  4. 工廠方法模式可以解決客戶端如何創建對象的問題,同時也可以方便地添加新的產品,而不需要修改現有的代碼。

  5. 工廠方法模式可以與其他設計模式結合使用,例如抽象工廠模式、單例模式等。

  6. 在C#中實現工廠方法模式,通常使用一個抽象工廠類別和多個具體工廠類別,以及一個產品介面和多個具體產品類別。