簡易的工廠設計模式

tokengo發表於2023-03-08

工廠設計模式是一種建立型設計模式,它提供了一種建立物件的最佳方式,而無需暴露物件的建立邏輯。在工廠模式中,我們定義一個介面或抽象類,該介面或抽象類用於建立物件,但讓子類決定要例項化的類。工廠方法模式使類的例項化延遲到其子類。

下面是一個完整的C#實現案例:

首先,我們定義一個介面,用於建立物件:

public interface IAnimal
{
    void Speak();
}

然後,我們定義兩個實現該介面的類:

public class Dog : IAnimal
{
    public void Speak()
    {
        Console.WriteLine("狗說:汪,汪");
    }
}

public class Cat : IAnimal
{
    public void Speak()
    {
        Console.WriteLine("貓說:喵。");
    }
}

接下來,我們定義一個工廠類,該類根據傳入的引數建立相應的物件:

public class AnimalFactory
{
    public IAnimal GetAnimal(string animalType)
    {
        switch (animalType.ToLower())
        {
            case "dog":
                return new Dog();
            case "cat":
                return new Cat();
            default:
                throw new ArgumentException("無效動物型");
        }
    }
}

最後,我們可以使用工廠類來建立物件:

AnimalFactory animalFactory = new AnimalFactory();

IAnimal dog = animalFactory.GetAnimal("dog");
dog.Speak(); // 輸出:狗說:汪汪

IAnimal cat = animalFactory.GetAnimal("cat");
cat.Speak(); // 輸出:貓說:喵

在這個例子中,我們使用工廠類來建立不同型別的動物物件,而不需要暴露物件的建立邏輯。這使得我們可以輕鬆地新增新的動物型別,而不需要修改現有的程式碼。

以下是一個抽象工廠的C#示例:

// 抽象產品介面
public interface IProduct
{
    void Use();
}

// 具體產品A
public class ProductA : IProduct
{
    public void Use()
    {
        Console.WriteLine("使用產品A");
    }
}

// 具體產品B
public class ProductB : IProduct
{
    public void Use()
    {
        Console.WriteLine("使用產品B");
    }
}

// 抽象工廠介面
public interface IFactory
{
    IProduct CreateProduct();
}

// 具體工廠A
public class FactoryA : IFactory
{
    public IProduct CreateProduct()
    {
        return new ProductA();
    }
}

// 具體工廠B
public class FactoryB : IFactory
{
    public IProduct CreateProduct()
    {
        return new ProductB();
    }
}

// 客戶端程式碼
public class Client
{
    private IFactory factory;

    public Client(IFactory factory)
    {
        this.factory = factory;
    }

    public void UseProduct()
    {
        IProduct product = factory.CreateProduct();
        product.Use();
    }
}

// 使用示例
Client clientA = new Client(new FactoryA());
clientA.UseProduct(); // 輸出:使用產品A

Client clientB = new Client(new FactoryB());
clientB.UseProduct(); // 輸出:使用產品B

在這個示例中,抽象工廠介面 IFactory 定義了一個 CreateProduct 方法,用於建立產品。具體工廠 FactoryAFactoryB 實現了 IFactory 介面,並分別建立了具體產品 ProductAProductB。客戶端程式碼 Client 接收一個工廠物件,並使用工廠物件建立產品並使用。這樣,客戶端程式碼就可以透過更換工廠物件來建立不同的產品。

相關文章