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

Java 設計模式入門(一):核心概念、必要性與 Abstract Factory 實戰

     編輯:Java 相關知識

什麼是設計模式?

針對反覆出現的問題,經驗證有效的解決策略。獨立於程式語言,解決常見 OO 設計問題。掌握模式術語可高效溝通,你可能已在無意識使用,只是缺乏標準名稱。

為何必須學習?

  • 職業 Java 程式設計師的必備素養
  • 加速 OOA/OOD 經驗積累,終身受益
  • 以標準術語與同儕高效溝通
  • 許多資深工程師不懂模式,但作為 OO 開發者必須精通
  • 學習模式會改變你的編程思維,讓你更睿智

模式數量與誤區

  • OO 領域至少 250+ 種模式(含反模式「義大利麵條式代碼」)
  • GoF 23 種最廣為人知,新模式持續發現中
  • 模式 ≠ 術語、演算法、組件

模式間關係

  • 和諧共存、相互觸發、部分可替代
  • 可被發現與文檔化
  • 非演算法、非架構
  • 提供解決問題的有效提示

創建型模式:Abstract Factory 抽象工廠

定義

提供比工廠方法更高層介面,常用於返回多個工廠中的某一個。

適用場景與優勢

  • 創建相互關聯/依賴的對象族(如 Kit)
  • 提供產品類庫,對外暴露介面而非實現細節
  • 隔離具體類與客戶端代碼
  • 系統需獨立於產品創建、組合、表現
  • 需強制約束、隱藏平台相關類
  • 易於對系統與對象族實施繼承

相關模式

  • Factory Method(常用抽象工廠方法實現)
  • Singleton、Prototype(常配合使用)
  • Facade(常搭配提供創建介面)

實戰代碼:本地/遠端資料庫連接工廠

介面定義

interface Local {
    DataInfo[] loadDB(String filename);
}
interface Remote extends Local {
    void connect2WWW(String url);
}

具體實現

class LocalMode implements Local {
    public DataInfo[] loadDB(String name) {
        System.out.print("Load from local database");
        return null;
    }
}
class RemoteMode implements Remote {
    public void connect2WWW(String url) {
        System.out.println("Connect to remote site");
    }
    public DataInfo[] loadDB(String name) {
        System.out.println("Load from remote database");
        return null;
    }
}

抽象工廠介面與實現

interface ConnectionFactory {
    Local getLocalConnection();
    Remote getRemoteConnection();
}

class DataManager implements ConnectionFactory {
    private boolean local = false;
    public Local getLocalConnection() { return new LocalMode(); }
    public Remote getRemoteConnection() { return new RemoteMode(); }

    public void loadData() {
        if (local) {
            Local conn = getLocalConnection();
            data = conn.loadDB("db.db");
        } else {
            Remote conn = getRemoteConnection();
            conn.connect2WWW("www.some.where.com");
            data = conn.loadDB("db.db");
        }
    }
    public void setConnection(boolean b) { local = b; }
}

測試驗證

class Test {
    public static void main(String[] args) {
        DataManager dm = new DataManager();
        if (args.length == 1) {  // 參數存在 → 本地模式
            dm.setConnection(true);
            dm.getLocalConnection().loadDB("db.db");
        } else {  // 無參數 → 遠端模式
            dm.getRemoteConnection().connect2WWW("www.javacamp.org/db/");
            dm.getRemoteConnection().loadDB("db.db");
        }
        // 後續統一處理 data,無需關心連接細節
    }
}

執行結果

C:\> java Test
Connect to remote site
Load from remote database

C:\> java Test local
Load from local database

擴展性展示

新增資料來源(如雲端)僅需:在 ConnectionFactory 加入方法、對應位置實現、無需修改既有程式結構。這正是 Sun 認證考試常考的設計精髓。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved