

關注對象創建過程,封裝實例化邏輯,降低客戶代碼與具體類耦合。
| 模式 | 核心意圖 | 關鍵角色 | 典型應用 |
|---|---|---|---|
| 簡單工廠 | 靜態工廠方法集中創建邏輯 | Factory、Product | JDBC DriverManager、Calendar.getInstance() |
| 工廠方法 | 定義創建接口,子類決定實例化類 | Creator、ConcreteCreator、Product | Collection.iterator()、DocumentBuilderFactory |
| 抽象工廠 | 創建相關/依賴對象族,無需指定具體類 | AbstractFactory、ConcreteFactory、AbstractProduct | 跨平台 GUI 工具包、數據源適配器 |
| 建造者 | 分步構建複雜對象,分離構建與表示 | Builder、Director、Product | StringBuilder、HttpClient.Builder、Lombok @Builder |
| 原型 | 通過複製原型創建新對象,避免昂貴構造 | Prototype、ConcretePrototype、Client | Object.clone()、Spring Bean 原型作用域 |
| 單例 | 保證類全局唯一實例,提供全局訪問點 | Singleton | Runtime.getRuntime()、Spring Bean 默認單例 |
關注類/對象組合,形成更大結構,保持靈活性與擴展性。
| 模式 | 核心意圖 | 關鍵角色 | 典型應用 |
|---|---|---|---|
| 適配器 | 將接口轉換為客戶期望的另一接口 | Target、Adaptee、Adapter | Arrays.asList()、Spring MVC HandlerAdapter |
| 橋接 | 將抽象與實現解耦,使二者可獨立變化 | Abstraction、Implementor | JDBC Driver、集合橋接(List/LinkedList) |
| 組合 | 樹形結構統一單個對象與組合對象接口 | Component、Leaf、Composite | Swing 組件樹、文件系統、XML DOM |
| 裝飾 | 動態添加職責,替代繼承擴展功能 | Component、Decorator、ConcreteDecorator | Java IO 流、Spring TransactionInterceptor |
| 外觀 | 為子系統提供統一高層接口,降低耦合 | Facade、Subsystem Classes | JDBC DataSource、SLF4J LoggerFactory |
| 享元 | 共享細粒度對象,節省內存 | Flyweight、FlyweightFactory | String 常量池、Integer 緩存、線程池 |
| 代理 | 為對象提供代理,控制訪問 | Subject、Proxy、RealSubject | Spring AOP、RPC Stub、虛代理圖片加載 |
關注對象間職責分配與通信,刻畫運行時難以靜態刻畫的控制流。
| 模式 | 核心意圖 | 關鍵角色 | 典型應用 |
|---|---|---|---|
| 模板方法 | 定義算法骨架,延遲步驟到子類 | AbstractClass、ConcreteClass | HttpServlet service()、AbstractList |
| 策略 | 定義算法族,封裝並可互換 | Strategy、Context、ConcreteStrategy | Collections.sort(Comparator)、Spring ResourceLoader |
| 觀察者 | 一對多依賴,狀態變更自動通知 | Subject、Observer、ConcreteObserver | EventListener、RxJava、Spring ApplicationEvent |
| 迭代器 | 順序訪問聚合元素,不暴露內部結構 | Iterator、Aggregate、ConcreteIterator | Collection.iterator()、ResultSet |
| 責任鏈 | 請求沿鏈路傳遞,多個處理器可處理 | Handler、ConcreteHandler | Servlet Filter、Spring Interceptor、Log4j Appender |
| 命令 | 將請求封裝為對象,支持撤銷/排隊/日誌 | Command、Receiver、Invoker | Runnable、菜單項、事務操作封裝 |
| 備忘錄 | 捕獲對象內部狀態,支持恢復 | Originator、Memento、Caretaker | 編輯器撤銷、序列化、棋類遊戲悔棋 |
| 狀態 | 對象內部狀態改變行為,類似換類 | State、Context、ConcreteState | 線程狀態、訂單流程、TCP 連接狀態機 |
| 訪問者 | 分離操作與數據結構,新增操作不改結構 | Visitor、Element、ObjectStructure | Javac AST 遍歷、編譯器各階段分析器 |
| 中介者 | 封裝對象交互,降低多對多耦合 | Mediator、Colleague | MVC Controller、消息總線、機場塔台 |
| 解釋器 | 定義語言文法並構建解釋器 | Expression、Terminal/Nonterminal | 正則表達式引擎、SQL 解析器、SpEL |
記住:模式是手段非目的,解決具體設計問題(擴展性、復用性、解耦)才是核心。過度使用模式會導致「模式癮」,增加不必要的複雜度。