工廠模式基礎概念
工廠模式是一種創建型設計模式,其核心思想是將對象的創建和使用分離。通過使用工廠模式,可以將對象創建邏輯集中管理,提高代碼的可維護性和可擴展性。在 Java 中,工廠模式主要分為三種類型:
- 簡單工廠模式?- 基礎實現,不屬于 GOF 23 種設計模式
- 工廠方法模式?- 定義創建對象的接口,由子類決定實例化哪個類
- 抽象工廠模式?- 創建一系列相關或依賴對象的接口,無需指定具體類
簡單工廠模式
簡單工廠模式是工廠模式的基礎實現,它定義了一個創建對象的類,根據參數的不同返回不同類的實例。
示例代碼
// 產品接口
interface Product {void operation();
}// 具體產品類A
class ConcreteProductA implements Product {@Overridepublic void operation() {System.out.println("ConcreteProductA operation");}
}// 具體產品類B
class ConcreteProductB implements Product {@Overridepublic void operation() {System.out.println("ConcreteProductB operation");}
}// 簡單工廠類
class SimpleFactory {public static Product createProduct(String type) {switch (type) {case "A":return new ConcreteProductA();case "B":return new ConcreteProductB();default:throw new IllegalArgumentException("Invalid product type: " + type);}}
}// 客戶端代碼
public class SimpleFactoryClient {public static void main(String[] args) {Product productA = SimpleFactory.createProduct("A");productA.operation(); // 輸出: ConcreteProductA operationProduct productB = SimpleFactory.createProduct("B");productB.operation(); // 輸出: ConcreteProductB operation}
}
優點:實現簡單,將對象創建和使用分離
缺點:工廠類職責過重,不符合開閉原則(新增產品需修改工廠類)
工廠方法模式
工廠方法模式定義了一個創建對象的接口,讓子類決定實例化哪個類。工廠方法將類的實例化延遲到子類。
示例代碼
// 產品接口
interface Product {void operation();
}// 具體產品類A
class ConcreteProductA implements Product {@Overridepublic void operation() {System.out.println("ConcreteProductA operation");}
}// 具體產品類B
class ConcreteProductB implements Product {@Overridepublic void operation() {System.out.println("ConcreteProductB operation");}
}// 抽象工廠類
abstract class Factory {public abstract Product createProduct();
}// 具體工廠類A - 生產產品A
class ConcreteFactoryA extends Factory {@Overridepublic Product createProduct() {return new ConcreteProductA();}
}// 具體工廠類B - 生產產品B
class ConcreteFactoryB extends Factory {@Overridepublic Product createProduct() {return new ConcreteProductB();}
}// 客戶端代碼
public class FactoryMethodClient {public static void main(String[] args) {Factory factoryA = new ConcreteFactoryA();Product productA = factoryA.createProduct();productA.operation(); // 輸出: ConcreteProductA operationFactory factoryB = new ConcreteFactoryB();Product productB = factoryB.createProduct();productB.operation(); // 輸出: ConcreteProductB operation}
}
優點:符合開閉原則,擴展性好
缺點:類的數量可能過多,增加系統復雜度
抽象工廠模式
抽象工廠模式提供一個創建一系列相關或依賴對象的接口,而無需指定它們具體的類。
示例代碼
// 產品A接口
interface ProductA {void operationA();
}// 產品B接口
interface ProductB {void operationB();
}// 具體產品A1
class ConcreteProductA1 implements ProductA {@Overridepublic void operationA() {System.out.println("ConcreteProductA1 operationA");}
}// 具體產品A2
class ConcreteProductA2 implements ProductA {@Overridepublic void operationA() {System.out.println("ConcreteProductA2 operationA");}
}// 具體產品B1
class ConcreteProductB1 implements ProductB {@Overridepublic void operationB() {System.out.println("ConcreteProductB1 operationB");}
}// 具體產品B2
class ConcreteProductB2 implements ProductB {@Overridepublic void operationB() {System.out.println("ConcreteProductB2 operationB");}
}// 抽象工廠接口
interface AbstractFactory {ProductA createProductA();ProductB createProductB();
}// 具體工廠1 - 生產產品A1和產品B1
class ConcreteFactory1 implements AbstractFactory {@Overridepublic ProductA createProductA() {return new ConcreteProductA1();}@Overridepublic ProductB createProductB() {return new ConcreteProductB1();}
}// 具體工廠2 - 生產產品A2和產品B2
class ConcreteFactory2 implements AbstractFactory {@Overridepublic ProductA createProductA() {return new ConcreteProductA2();}@Overridepublic ProductB createProductB() {return new ConcreteProductB2();}
}// 客戶端代碼
public class AbstractFactoryClient {public static void main(String[] args) {// 使用工廠1創建產品族1AbstractFactory factory1 = new ConcreteFactory1();ProductA productA1 = factory1.createProductA();ProductB productB1 = factory1.createProductB();productA1.operationA(); // 輸出: ConcreteProductA1 operationAproductB1.operationB(); // 輸出: ConcreteProductB1 operationB// 使用工廠2創建產品族2AbstractFactory factory2 = new ConcreteFactory2();ProductA productA2 = factory2.createProductA();ProductB productB2 = factory2.createProductB();productA2.operationA(); // 輸出: ConcreteProductA2 operationAproductB2.operationB(); // 輸出: ConcreteProductB2 operationB}
}
優點:
- 可以在類的內部對產品族中相關聯的多等級產品共同管理
- 客戶端始終只使用一個工廠的對象
- 符合開閉原則
缺點:
- 產品族擴展困難(新增一個產品需要修改多個接口和類)
- 實現復雜
三種工廠模式的對比
類型 | 工廠職責 | 產品等級結構 | 擴展性 |
---|---|---|---|
簡單工廠模式 | 集中所有產品創建 | 單一等級 | 不符合開閉原則 |
工廠方法模式 | 由子類負責創建 | 單一等級 | 符合開閉原則 |
抽象工廠模式 | 創建一系列產品 | 多個等級(產品族) | 產品族擴展困難 |
工廠模式的應用場景
- 對象創建邏輯復雜?- 當對象創建過程涉及復雜的初始化邏輯時
- 根據條件動態創建對象?- 如根據配置或用戶輸入創建不同類型的對象
- 產品等級結構管理?- 當系統需要處理多個產品族時
注意事項
- 避免過度使用?- 簡單場景下無需使用工廠模式
- 權衡設計復雜度?- 選擇合適的工廠模式類型
- 與其他模式結合?- 工廠模式常與單例模式、策略模式等結合使用
工廠模式是一種非常實用的設計模式,它能夠將對象的創建和使用分離,提高代碼的可維護性和可擴展性。在實際應用中,需要根據具體場景選擇合適的工廠模式實現。