本文介紹三大經典模式在 JDK/JAXP 中的應用:**Command**(回調物件化)、**Abstract Factory/Factory Method**(面向介面建構)、**Singleton**(唯一實例控制)。
C/C++ 使用函數指標實作回調,Java 無指標,以 **Command 物件** 封裝請求:
Command 介面定義 execute()。Invoker 持有 Command 參考,呼叫 execute()。Receiver 執行實際邏輯(Command 可委派或自行處理)。DocumentListener 等監聽器即 Command:註冊後,事件發生時呼叫對應方法(insertUpdate、removeUpdate)。
ActionListener,本身即事件監聽器。
interface Task { void taskPerform(); }
class BackupTask implements Task { ... }
class ScanDiskTask implements Task { ... }
class TaskEntry {
Task task; long interval, lastDone;
// getter/setter
}
class TaskSchedule extends Thread {
List tasks = new ArrayList<>();
void addTask(TaskEntry e) { tasks.add(e); }
void schedulePerform() {
sleep(minInterval);
for (TaskEntry e : tasks) {
if (due) { e.getTask().taskPerform(); e.setLastDone(now); }
}
}
}
排程器不知任務細節,僅觸發 Task 介面,實現解耦。
透過工廠建立符合介面規範的物件,實現**多型替換**(切換解析器無需改程式碼)。
// Factory Method:靜態方法依環境變數決定具體工廠子類
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// Abstract Factory:工廠建立一族相關物件
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new File("data.xml"));
newInstance() 依 javax.xml.parsers.DocumentBuilderFactory 系統屬性建立具體工廠(如 Xerces、Crimson)。DocumentBuilderFactory 介面建立 DocumentBuilder、Document、Node 等**相關物件族**。
public final class Math { // 所有方法 static,建構子 private
private Math() {}
public static double sin(double a) { ... }
}
public class Singleton {
private static volatile Singleton instance;
protected Singleton() {} // 允許子類建構
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) instance = new Singleton();
}
}
return instance;
}
// 防止 clone 破壞單例
protected Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}
}
volatile + 雙重檢查鎖定(DCL)確保執行緒安全與效能。protected 建構子允許子類化,private 則禁止。clone() 拋出異常防止複製。| 模式 | 用途 | 關鍵點 |
|---|---|---|
| Command | 封裝請求,支援撤銷/佇列/日誌 | 介面統一,物件化回調 |
| Factory Method | 延遲具體類別建立至子類/參數 | 虛擬建構子,單一物件 |
| Abstract Factory | 建立相關物件族 | 介面定義多個建立方法 |
| Singleton | 確保全域唯一實例 | 私有建構子、靜態工廠、防克隆 |
| Builder | 分步建構複雜物件 | 分離建構算法與表示 |
| Prototype | 複製原型建立新物件 | clone() 機制 |