工廠方法模式 - Factory Method Pattern
用途
處理在不指定對象具體類別的情況下建立對象的問題
classDiagram
IProduct <|-- ConcreteProductA
IProduct <|-- ConcreteProductB
IFactory <|-- ConcreteFactoryA
ConcreteProductA <.. ConcreteFactoryA
ConcreteProductB <.. ConcreteFactoryB
IFactory <|-- ConcreteFactoryB
class IProduct{
<<Interface>>
+Make()
}
class ConcreteProductA{
+Make()
}
class ConcreteProductB{
+Make()
}
class IFactory{
<<Interface>>
+CreateProduct() IProduct
}
class ConcreteFactoryA{
+CreateProduct() ConcreteProductA
}
class ConcreteFactoryB{
+CreateProduct() ConcreteProductB
}
例子
我們可以想像一個蛋糕店
蛋糕店可以製作各種類型的蛋糕例如巧克力蛋糕、草莓蛋糕、檸檬蛋糕等
每種蛋糕都有自己的製作方法和配方,但老闆不必知道如何製作每一種蛋糕
相反,老闆將這個責任交給了不同的蛋糕師傅,每個蛋糕師傅專門負責製作一種蛋糕
Product
產品的抽象類別或介面,它定義了產品的共同屬性和方法
1
2
3
4
5
// 產品介面
public interface ICake
{
void Make();
}
Concrete Product
產品的具體實現,例如巧克力蛋糕、草莓蛋糕等
每種蛋糕都實現了產品的介面,並提供了自己的製作方法和配方
1
2
3
4
5
6
7
8
// 具體產品:巧克力蛋糕
public class ChocolateCake : ICake
{
public void Make()
{
Console.WriteLine("製作巧克力蛋糕");
}
}
1
2
3
4
5
6
7
8
// 具體產品:草莓蛋糕
public class StrawberryCake : ICake
{
public void Make()
{
Console.WriteLine("製作草莓蛋糕");
}
}
Factory
工廠的抽象類別或介面,它定義了製造產品的方法
這個方法可以根據需要返回不同的具體產品
1
2
3
4
5
// 工廠介面
public interface ICakeFactory
{
ICake CreateCake();
}
Concrete Factory
工廠的具體實現,它實現了製造產品的方法
每個具體工廠專門負責製作一種特定的產品
1
2
3
4
5
6
7
8
// 具體工廠:巧克力蛋糕工廠
public class ChocolateCakeFactory : ICakeFactory
{
public ICake CreateCake()
{
return new ChocolateCake();
}
}
1
2
3
4
5
6
7
8
// 具體工廠:草莓蛋糕工廠
class StrawberryCakeFactory : ICakeFactory
{
public ICake CreateCake()
{
return new StrawberryCake();
}
}
Client
創建工廠以製作蛋糕
1
2
3
4
5
6
7
8
9
10
11
// 創建巧克力蛋糕工廠
ICakeFactory chocolateFactory = new ChocolateCakeFactory();
// 使用巧克力蛋糕工廠製作蛋糕
ICake chocolateCake = chocolateFactory.CreateCake();
chocolateCake.Make();
// 創建草莓蛋糕工廠
ICakeFactory strawberryFactory = new StrawberryCakeFactory();
// 使用草莓蛋糕工廠製作蛋糕
ICake strawberryCake = strawberryFactory.CreateCake();
strawberryCake.Make();
延伸
本文章以 CC BY 4.0 授權