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

從 Java 類庫看設計模式(二):Command、Factory 與 Singleton 模式實戰

     編輯:Java 相關知識

前言

本文介紹三大經典模式在 JDK/JAXP 中的應用:**Command**(回調物件化)、**Abstract Factory/Factory Method**(面向介面建構)、**Singleton**(唯一實例控制)。

Command 模式:Swing Action 的物件化回調

背景

C/C++ 使用函數指標實作回調,Java 無指標,以 **Command 物件** 封裝請求:

  • Command 介面定義 execute()。
  • Invoker 持有 Command 參考,呼叫 execute()。
  • Receiver 執行實際邏輯(Command 可委派或自行處理)。

JDK 代理事件模型

DocumentListener 等監聽器即 Command:註冊後,事件發生時呼叫對應方法(insertUpdate、removeUpdate)。

Swing Action:Command 的豐富擴充

  • 繼承 ActionListener,本身即事件監聽器。
  • 額外提供:**文字/圖示描述**、**啟用/停用狀態**、**多元件共享**(按鈕、選單、快捷鍵共用同一 Action 實例)。
  • 更像「領域物件」而非單純回調函數。

應用範例:任務排程器


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 介面,實現解耦。

Abstract Factory 與 Factory Method:JAXP 解析器工廠

核心原則:面向介面編程

透過工廠建立符合介面規範的物件,實現**多型替換**(切換解析器無需改程式碼)。

JAXP DOM 解析器建立流程


// Factory Method:靜態方法依環境變數決定具體工廠子類
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// Abstract Factory:工廠建立一族相關物件
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new File("data.xml"));
  • Factory Method:newInstance() 依 javax.xml.parsers.DocumentBuilderFactory 系統屬性建立具體工廠(如 Xerces、Crimson)。
  • Abstract Factory:DocumentBuilderFactory 介面建立 DocumentBuilder、Document、Node 等**相關物件族**。

Singleton 模式:唯一實例的安全實作

簡單版


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() 拋出異常防止複製。
  • JDK 1.2+ 修正 GC 導致類卸載問題,無需額外強參考。

創建型模式總覽

模式用途關鍵點
Command封裝請求,支援撤銷/佇列/日誌介面統一,物件化回調
Factory Method延遲具體類別建立至子類/參數虛擬建構子,單一物件
Abstract Factory建立相關物件族介面定義多個建立方法
Singleton確保全域唯一實例私有建構子、靜態工廠、防克隆
Builder分步建構複雜物件分離建構算法與表示
Prototype複製原型建立新物件clone() 機制
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved