首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 設計模式學習筆記:工廠方法與抽象工廠的演進之路

     編輯:Java 程式設計入門

從 new 到工廠:為什麼需要創建型模式?

直接 new A() 存在三大痛點:

  1. 構造函數參數過多、邏輯複雜(查庫、初始化),違反單一職責
  2. 具體類硬編碼,擴展子類需修改調用處,違反開閉原則
  3. 創建邏輯分散,難以統一管理(如單例、池化、緩存)

工廠模式核心思想:將「創建」與「使用」分離,封裝實例化細節。

簡單工廠:起步


public class Factory {
    public static Sample create(int type) {
        if (type == 1) return new SampleA();
        else if (type == 2) return new SampleB();
        throw new IllegalArgumentException();
    }
}
// 使用
Sample s = Factory.create(1);

優點:調用者不依賴具體類。缺點:新增產品需修改工廠類(違反開閉),邏輯集中膨脹。

工廠方法:多態延遲創建

定義抽象工廠接口,子類決定實例化哪個具體產品:


interface Factory { Sample create(); }
class FactoryA implements Factory { public Sample create() { return new SampleA(); } }
class FactoryB implements Factory { public Sample create() { return new SampleB(); } }
  • 符合開閉原則:新增產品只需新增對應工廠類
  • 常與 動態類加載 結合:配置文件指定工廠類名,Class.forName() 實例化

實戰案例:Jive ForumFactory


public abstract class ForumFactory {
    private static ForumFactory factory;
    public static ForumFactory getInstance(Authorization auth) {
        if (factory == null) synchronized(initLock) {
            if (factory == null) {
                Class c = Class.forName("com.jivesoftware.forum.database.DbForumFactory");
                factory = (ForumFactory) c.newInstance();
            }
        }
        return new ForumFactoryProxy(auth, factory, ...); // Proxy 模式控制權限
    }
    public abstract Forum createForum(String name, String desc);
}

亮點:單例 + 工廠方法 + 動態加載 + 動態代理 多模式協作,實現存儲引擎熱插拔(數據庫/文件系統)與權限控制。

Java Pet Store CatalogDAOFactory


public class CatalogDAOFactory {
    public static CatalogDAO getDAO() {
        String className = (String) new InitialContext().lookup("CATALOG_DAO_CLASS");
        return (CatalogDAO) Class.forName(className).newInstance();
    }
}

JNDI 注入實現類名,零代碼修改切換數據庫實現。

抽象工廠:產品族的統一創建

當系統需要創建多個相關/依賴的產品族時(如 Sample + Sample2),且不同族內部有關聯約束:


abstract class AbstractFactory {
    abstract Sample createSample();
    abstract Sample2 createSample2();
}
class SimpleFactory extends AbstractFactory {
    Sample createSample() { return new SampleA(); }
    Sample2 createSample2() { return new Sample2A(); } // 簡單工藝族
}
class BombFactory extends AbstractFactory {
    Sample createSample() { return new SampleB(); }
    Sample2 createSample2() { return new Sample2B(); } // 複雜工藝族
}

關鍵差異:

  • 工廠方法:單一產品等級結構
  • 抽象工廠:多個產品等級結構,構成產品族,族內產品有協作關係

模式選擇指南

心得總結

  1. 封裝變化:工廠本質是將「易變的創建細節」封裝在穩定接口後
  2. 配置驅動:配合屬性文件/JNDI/Spring XML 實現零代碼切換實現
  3. 組合拳:工廠常與單例、代理、建造者、原型等模式協作
  4. 別過度設計:簡單場景直接 new 或簡單工廠足矣,需擴展時再重構

掌握工廠族模式,關鍵在於識別「創建邏輯變化點」並為其建立穩定抽象,而非機械套用結構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
場景推薦模式理由
創建邏輯固定、產品單一、無擴展需求簡單工廠簡單直接
產品單一但頻繁擴展、需解耦創建邏輯工廠方法開閉原則、動態加載友好
需創建一組相關產品、族內有約束、需整體切換抽象工廠保證族內一致性