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