【工廠方法模式】工廠方法模式是一種常用的創建型設計模式,它定義了一個創建對象的接口,但讓子類決定實例化哪一個類。工廠方法將對象的創建過程封裝起來,使系統更加靈活和可擴展。
一、概述
工廠方法模式通過引入一個抽象的工廠類,由具體的子類來實現對象的創建。這種模式的核心思想是“將對象的創建與使用分離”,從而提高系統的靈活性和可維護性。
二、結構組成
| 名稱 | 說明 |
| Product | 定義產品接口或抽象類,所有具體產品都實現該接口或繼承該類。 |
| ConcreteProduct | 具體的產品類,實現Product接口或繼承Product類。 |
| Creator | 定義工廠類的接口,包含一個工廠方法(Factory Method),返回Product類型。 |
| ConcreteCreator | 具體的工廠類,實現Creator接口,并重寫工廠方法以返回具體的Product實例。 |
三、優點
| 優點 | 說明 |
| 松耦合 | 客戶端無需知道具體產品類,只需依賴Product接口或抽象類。 |
| 易于擴展 | 新增產品時,只需添加新的ConcreteProduct和ConcreteCreator類,無需修改原有代碼。 |
| 符合開閉原則 | 對擴展開放,對修改關閉。 |
| 提高代碼復用性 | 工廠方法可以被多個地方調用,避免重復代碼。 |
四、缺點
| 缺點 | 說明 |
| 增加系統復雜度 | 引入更多的類,增加系統復雜性。 |
| 需要額外的類來實現 | 每個產品都需要一個對應的工廠類,可能造成類的數量增加。 |
| 不適合簡單場景 | 對于簡單的對象創建,使用工廠方法可能顯得過于復雜。 |
五、適用場景
| 場景 | 說明 |
| 對象創建邏輯復雜 | 當對象的創建過程比較復雜時,使用工廠方法可以簡化客戶端代碼。 |
| 系統需要動態擴展 | 當系統需要支持多種產品類型,并且未來可能會有新增產品時。 |
| 客戶端不需要知道具體類 | 客戶端只需要使用統一的接口來獲取產品,而不需要關心具體實現。 |
六、示例代碼(Java)
```java
// Product 接口
interface Product {
void use();
}
// 具體產品A
class ConcreteProductA implements Product {
public void use() {
System.out.println("使用產品A");
}
}
// 具體產品B
class ConcreteProductB implements Product {
public void use() {
System.out.println("使用產品B");
}
}
// Creator 抽象類
abstract class Creator {
public abstract Product factoryMethod();
public void doSomething() {
Product product = factoryMethod();
product.use();
}
}
// 具體工廠A
class ConcreteCreatorA extends Creator {
public Product factoryMethod() {
return new ConcreteProductA();
}
}
// 具體工廠B
class ConcreteCreatorB extends Creator {
public Product factoryMethod() {
return new ConcreteProductB();
}
}
```
七、總結
工廠方法模式通過將對象的創建交給子類處理,實現了對象創建與使用的解耦。它提高了系統的靈活性和可維護性,適用于需要動態擴展產品類型的場景。雖然增加了系統復雜度,但在大型項目中具有重要的應用價值。


