在企業級應用開發中,經常面臨這樣的場景:業務邏輯需要頻繁新增功能,但又不希望修改既有原始碼,更不想重新編譯整個專案。例如,金融系統需為不同客戶提供差異化的定價策略,市場部門可能隨時新增方案。若每次都要改動核心代碼,不僅風險高,也違背「開放封閉原則」。
假設有兩種定價方案:方案 A 每筆固定 20 元;方案 B 前 10 筆 15 元,之後 10 元。若直接為每個方案建立類別(PricingPlan20、PricingPlan1510),並在 Trade 類中用 if (planId == 1) 判斷實例化哪個類,程式碼會隨著方案增加而膨脹,維護困難。
定義 IPricingPlan 介面,規範 calculateCommission(Trade) 方法。所有具體方案類別實作此介面。Trade 持有介面型別變數,執行期根據方案 ID 實例化對應實作類。這樣新增方案只需新增實作類,完全不動 Trade 核心邏輯。
進一步利用 Class.forName(String className),將類別全名儲存於設定檔或資料庫。執行期讀取字串,反射實例化:
String className = config.getPlanClassName(planId); // 如 "com.example.PricingPlanVIP"
Class<?> clazz = Class.forName(className);
IPricingPlan plan = (IPricingPlan) clazz.getDeclaredConstructor().newInstance();
如此,甚至不需重新編譯主程式,只要將新類別 JAR 放入 classpath、更新設定即可熱插拔。
掌握「介面 + 動態載入」模式,是打造高擴展性 Java 系統的關鍵基石。