工廠方法模式定義一個用於創建對象的接口,讓子類決定實例化哪個類。工廠方法將類的實例化延遲到其子類。
—— GoF《設計模式》
// 抽象產品
public abstract class Product {
public void commonMethod() { /* 共同邏輯 */ }
public abstract void specificMethod();
}
// 具體產品
public class ConcreteProductA extends Product {
public void specificMethod() { /* 實現 A */ }
}
public class ConcreteProductB extends Product {
public void specificMethod() { /* 實現 B */ }
}
// 抽象工廠
public abstract class Creator {
public abstract <T extends Product> T createProduct(Class<T> clazz);
}
// 具體工廠(反射實現通用創建)
public class ConcreteCreator extends Creator {
public <T extends Product> T createProduct(Class<T> clazz) {
try {
return clazz.getDeclaredConstructor().newInstance();
} catch (Exception e) {
throw new RuntimeException("創建產品失敗", e);
}
}
}
// 客戶端使用
public class Client {
public static void main(String[] args) {
Creator creator = new ConcreteCreator();
Product product = creator.createProduct(ConcreteProductA.class);
product.specificMethod();
}
}
DriverManager.getConnection() - 根據 URL 創建不同數據庫連接LoggerFactory.getLogger() - 適配不同日誌實現Collections.synchronizedList() - 創建線程安全包裝器BeanFactory - 核心 IOC 容器即工廠方法模式體現public class ShapeFactory {
public Shape createShape(String type) {
switch (type.toLowerCase()) {
case "circle": return new Circle();
case "rectangle": return new Rectangle();
default: throw new IllegalArgumentException("未知形狀: " + type);
}
}
}
通過參數決定創建哪種產品,適用於產品類型固定、數量較少的場景。
工廠方法模式通過「定義接口、子類實例化」將對象創建與使用解耦,是企業級開發中最高頻、最實用的創建型模式之一。掌握其精髓:面向抽象編程,封裝變化,延遲綁定。