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

《Java 與模式》讀書筆記:設計原則、創建型模式與核心角色深度解析

     編輯:Java 綜合教學

《Java 與模式》讀書筆記:設計原則與創建型模式精華

《Java 與模式》(阎宏 著)是國內經典的設計模式入門著作,以 Java 語言為載體,深入淺出講解 GoF 23 種模式。本筆記提煉書籍核心內容:六大設計原則、創建型模式五種模式的結構角色、適用場景及代碼骨架,作為快速查閱與復習參考。

一、 六大設計原則 (SOLID + 更多)

原則核心定義指導意義
開閉原則 (OCP)對擴展開放,對修改關閉抽象層穩定,實現層擴展;用接口/抽象類定義規範
里氏替換原則 (LSP)子類必須能替換父類且不影響正確性繼承必須是 is-a 關係;避免破壞父類契約的重寫
依賴倒置原則 (DIP)依賴抽象,不依賴具體實現高層模塊不依賴低層,雙方依賴抽象;控制反轉 (IoC) 基石
合成復用原則 (CARP)優先使用組合/聚合,少用繼承降低耦合,提高靈活性;委託替代繼承
迪米特法則 (LoD)最少知識原則:一個對象應盡量少與其他對象交互降低類間耦合;僅與直接朋友通信
接口隔離原則 (ISP)接口應小而專,不應強迫客戶依賴不用的方法拆分臃腫接口;多個專用接口優於單一總接口

二、 抽象類設計準則

  • 代碼最大化:將共同邏輯、模板方法上移至抽象類,減少子類重復代碼。
  • 數據最小化:抽象類盡量不定義實例字段(狀態),狀態由子類管理;若需共享狀態,用 `protected` 訪問器封裝。

三、 創建型模式總覽

核心目的:**封裝對象創建過程**,將「客戶端代碼」與「具體類實例化」解耦。分為兩類:

  • 類創建型:利用繼承,將實例化推遲到子類(工廠方法模式)。
  • 對象創建型:利用委託,動態決定實例化邏輯(簡單工廠、抽象工廠、建造者、原型、單例)。

四、 五大創建型模式深度解析

1. 簡單工廠模式 (Simple Factory) — 非 GoF 正式模式,但極常用

角色:

  • 工廠類 (Creator):靜態工廜方法,根據參數決定創建哪個產品。
  • 抽象產品 (Product):接口或抽象類。
  • 具體產品 (ConcreteProduct):實現產品接口。
// 工廠類
public class ShapeFactory {
    public static Shape createShape(String type) {
        if ("circle".equalsIgnoreCase(type)) return new Circle();
        if ("rect".equalsIgnoreCase(type)) return new Rectangle();
        throw new IllegalArgumentException("Unknown shape");
    }
}
// 客戶端
Shape s = ShapeFactory.createShape("circle");

缺點:違反 OCP,新增產品需修改工廠類代碼。

2. 工廠方法模式 (Factory Method)

角色:

  • 抽象工廠 (Creator):聲明工廠方法 `factoryMethod()`,返回 `Product`。
  • 具體工廠 (ConcreteCreator):實現工廠方法,實例化具體產品。
  • 抽象產品 / 具體產品:同簡單工廠。
// 抽象工廠
public abstract class LoggerFactory {
    public abstract Logger createLogger(); // 工廠方法
    // 模板方法
    public void log(String msg) {
        Logger logger = createLogger();
        logger.write(msg);
    }
}
// 具體工廠
public class FileLoggerFactory extends LoggerFactory {
    @Override public Logger createLogger() { return new FileLogger(); }
}
public class ConsoleLoggerFactory extends LoggerFactory {
    @Override public Logger createLogger() { return new ConsoleLogger(); }
}

優勢:符合 OCP,新增產品只需新增對應工廠類,無需修改現有代碼。

3. 抽象工廠模式 (Abstract Factory)

核心區別:工廠方法針對「單一產品等級結構」;抽象工廠針對「多個產品族/等級結構」(如:不同 OS 下的 Button、ScrollBar、Window)。

角色:抽象工廠 (聲明多個創建方法)、具體工廠 (實現一族產品創建)、多組抽象/具體產品。

// 抽象工廠接口
public interface GUIFactory {
    Button createButton();
    Checkbox createCheckbox();
}
// 具體工廠族
public class WinFactory implements GUIFactory {
    public Button createButton() { return new WinButton(); }
    public Checkbox createCheckbox() { return new WinCheckbox(); }
}
public class MacFactory implements GUIFactory {
    public Button createButton() { return new MacButton(); }
    public Checkbox createCheckbox() { return new MacCheckbox(); }
}

4. 單例模式 (Singleton)

三要素:私有構造器、靜態私有實例、靜態公有獲取方法。

線程安全寫法推薦 (雙重檢查鎖 DCL / 靜態內部類 / 枚舉):

// 1. 靜態內部類 (推薦:延遲加載、線程安全、簡潔)
public class Singleton {
    private Singleton() {}
    private static class Holder { static final Singleton INSTANCE = new Singleton(); }
    public static Singleton getInstance() { return Holder.INSTANCE; }
}

// 2. 枚舉 (最簡潔、防反射/序列化破壞)
public enum SingletonEnum { INSTANCE; }

5. 建造者模式 (Builder)

核心場景:構建復雜對象(參數多、有順序依賴、不可變對象)。將「構建過程」與「表示」分離。

角色:Product (產品)、Builder (抽象建造者)、ConcreteBuilder (具體建造者)、Director (指揮者/可選)。

// 產品類 (不可變)
public class User {
    private final String name;
    private final int age;
    private final String email;
    private final String address;
    
    private User(Builder builder) { // 私有構造器
        this.name = builder.name; this.age = builder.age;
        this.email = builder.email; this.address = builder.address;
    }
    // 靜態內部建造者類
    public static class Builder {
        private String name; private int age; private String email; private String address;
        public Builder name(String v) { name = v; return this; }
        public Builder age(int v) { age = v; return this; }
        public Builder email(String v) { email = v; return this; }
        public Builder address(String v) { address = v; return this; }
        public User build() { return new User(this); }
    }
}
// 客戶端鏈式調用
User user = new User.Builder().name("Tom").age(25).email("tom@mail.com").build();

五、 總結與對比

模式核心意圖適用場景關鍵點
簡單工廠集中創建邏輯產品類較少、固定、客戶端不關心創建細節靜態工廠方法,違反 OCP
工廠方法延遲創建到子類框架設計、插件架構、需支持擴展新產品一個工廠對應一個產品,符合 OCP
抽象工廠創建產品族系統需支持多產品族切換(如跨平台 UI、多数據源適配)接口定義多個創建方法,產品族內部約束
單例全局唯一實例配置管理器、連接池、線程池、緩存管理器私有構造、靜態內部類/枚舉實現
建造者構建復雜對象參數多、可選參數多、構建順序敏感、不可變對象鏈式調用、Director 可選、與工廠區別在於「過程」

六、 學習建議

  1. 先理解設計原則,再看模式——模式是原則的具體應用。
  2. 手寫每種模式的核心骨架代碼,體會角色交互。
  3. 閱讀 JDK 源碼、Spring 源碼識別模式:Calendar.getInstance() (工廠方法)、Collections.singletonList() (單例)、StringBuilder (建造者)、DocumentBuilderFactory (抽象工廠)。
  4. 實戰中不要為了用模式而用模式,YAGNI 原則:簡單場景用簡單工廐或直接 new,復雜才引入模式。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved