文章

簡單工廠模式 - Simple Factory Pattern

用途

在軟體開發中,簡單工廠模式用於封裝物件的創建邏輯,

客戶只需要提供必要的參數,而不需要關心具體的物件創建過程。

classDiagram
  Product <|-- ConcreteProductA
  Product <|-- ConcreteProductB
  Product <.. Client
  Factory <.. Client
  ConcreteProductA <.. Factory
  ConcreteProductB <.. Factory
  class Client{
    +Operation()
  }
  class Product{
    <<Abstract>>
    +MethodA()*
    +MethodB()*
    +MethodC()*
  }
  class ConcreteProductA{
    +MethodA()
    +MethodB()
    +MethodC()
  }
  class ConcreteProductB{
    +MethodA()
    +MethodB()
    +MethodC()
  }
  class Factory{
    +ConstructProduct(string key) Product
  }

例子

我們可以使用一個生活中的例子來解釋,比如一家披薩店

假設有一家披薩店,該店提供多種不同口味的披薩,如芝士披薩蘑菇披薩火腿披薩等。
客戶在點餐時只需要提供披薩的口味,而不需要關心每種披薩如何製作。

在這個例子中,
披薩店(Factory)就是簡單工廠,
披薩(Product)則是由簡單工廠根據客戶(Client)點餐的要求來創建。
客戶只需要告訴披薩店要的披薩口味(Key),披薩店就會根據這個要求創建相應的披薩(ConcreteProduct)

Aabstract/Interface Product

1
2
3
4
5
6
7
8
// 抽象披薩類別
public abstract class Pizza
{
    public abstract void Prepare();
    public abstract void Bake();
    public abstract void Cut();
    public abstract void Box();
}

Concrete Product

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 具體的起司披薩
public class CheesePizza : Pizza
{
    public override void Prepare()
    {
        Console.WriteLine("Preparing Cheese Pizza");
    }

    public override void Bake()
    {
        Console.WriteLine("Baking Cheese Pizza");
    }

    public override void Cut()
    {
        Console.WriteLine("Cutting Cheese Pizza");
    }

    public override void Box()
    {
        Console.WriteLine("Boxing Cheese Pizza");
    }
}

Simple Factory

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 簡單披薩工廠
public class SimplePizzaFactory {
    public Pizza CreatePizza(string type) {
        Pizza pizza = null;

        // 根據口味創建相應的披薩
        switch (type) {
            case "cheese":
                pizza = new CheesePizza();
                break;
            case "mushroom":
                pizza = new MushroomPizza();
                break;
            case "pepperoni":
                pizza = new PepperoniPizza();
                break;
            default:
                // 如果口味不匹配,可以在這裡執行一些預設的處理邏輯,如創建一個預設的披薩或拋出異常等
                break;
        }

        return pizza;
    }
}

Client

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SimplePizzaFactory factory = new SimplePizzaFactory();

// 客戶點餐:起司披薩
Pizza cheesePizza = factory.CreatePizza("cheese");
cheesePizza.Prepare();
cheesePizza.Bake();
cheesePizza.Cut();
cheesePizza.Box();

Console.WriteLine();

// 客戶點餐:蘑菇披薩
Pizza mushroomPizza = factory.CreatePizza("mushroom");
mushroomPizza.Prepare();
mushroomPizza.Bake();
mushroomPizza.Cut();
mushroomPizza.Box();

延伸

搭配其他設計模式使用

本文章以 CC BY 4.0 授權