簡單工廠模式 - 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  授權