工廠模式是一種創建型設計模式,其核心在於提供一個創建對象的介面,讓子類決定實例化哪一個類別。簡單來說,它將對象的創建邏輯封裝起來,讓調用者不需要知道具體的類別名稱,只需透過工廠獲取所需的產品實例。
在 Java 開發中,new 關鍵字無處不在。但隨著系統擴展,直接使用 new 會導致:
工廠模式透過「委派」創建職責給專門的工廠類,完美解決上述問題。著名的 Jive 論壇系統大量採用此模式,足見其實用性。
雖非標準 GoF 模式,但最常用。透過一個靜態方法根據參數返回不同實例:
public class SampleFactory {
public static Sample create(int type) {
if (type == 1) return new SampleA();
else if (type == 2) return new SampleB();
throw new IllegalArgumentException("未知類型");
}
}
客戶端調用:Sample s = SampleFactory.create(1); 完全屏蔽了具體子類。
定義一個創建對象的抽象方法,由子類實現。適用於「一個工廠對應一個產品」的場景:
public abstract class Factory {
public abstract Sample create();
}
public class ConcreteFactoryA extends Factory {
public Sample create() { return new SampleA(); }
}
提供一個介面,可創建一系列「相關或依賴的對象」,而無需指定它們的具體類。例如同時生產 Sample 和 Sample2 兩條產品線:
public abstract class AbstractFactory {
public abstract Sample createSample();
public abstract Sample2 createSample2();
}
public class SimpleFactory extends AbstractFactory {
public Sample createSample() { return new SampleA(); }
public Sample2 createSample2() { return new Sample2A(); }
}
此模式將「同一風格」的產品綁定在同一工廠,確保產品間的協作一致性。
Jive ForumFactory 結合了單例模式與類載入機制,透過配置 className 實現資料庫存儲與文件存儲的無縫切換,展現了工廠模式強大的擴展性。
Pet Store 的 CatalogDAOFactory 則利用 JNDI 查找具體實現類,實現了 DAO 層的解耦,只需修改配置即可適配不同資料庫。
下次當你寫下 new Xxx() 時,請問自己:是否需要一個工廠來賦予系統更大的靈活性?