許多開發者誤以為介面只是「替代多重繼承」的妥協產物。實則不然——介面的核心價值在於「型別抽象」,而非程式碼重用。繼承的本質同樣是抽象(提供模板),而非單純為了重用父類方法。本文透過資料庫連線的工廠模式實例,層層剖析介面、繼承、委派的真諦。
class A { void run() { ... } }
class B extends A { } // 只是想用 run()
正確做法:委派/組合
class B {
private A a = new A();
void doRun() { a.run(); }
}
這正是 GoF 設計模式一貫倡導的「組合優於繼承」原則。
情境:應用需支援 MySQL、Oracle、SQL Server、DB2 多種資料庫,但業務邏輯不想耦合具體實作。
package org.bromon.test;
public interface DB {
Connection openDB(String url, String user, String pwd);
void close();
}
public class Mysql implements DB { /* 實作細節 */ }
public class Oracle implements DB { /* 實作細節 */ }
public class DBFactory {
public static DB getConn() {
return new Mysql(); // 或依設定檔動態決定
}
}
DB db = DBFactory.getConn(); // 僅依賴 DB 介面
Connection conn = db.openDB(...);
此即「開閉原則」與「依賴倒置」的具體落地:高層模組不依賴低層模組,雙方依賴抽象。
理解這兩點,你的 Java 設計將從「能跑」進化為「好維護、易擴展」。