23種設計模式全面解析

設計模式是解決軟件設計中常見問題的經典方案。根據《設計模式:可復用面向對象軟件的基礎》(GoF),23種設計模式分為以下三類:


一、創建型模式(5種)

目標:解耦對象的創建過程,提高系統靈活性

模式名稱核心思想典型應用場景
工廠方法定義創建對象的接口,子類決定實例化哪個類數據庫連接器、日志記錄器
抽象工廠創建相關或依賴對象的家族,不指定具體類GUI組件庫、跨平臺系統適配
建造者分步構建復雜對象,分離構造與表示XML解析器、游戲角色生成器
原型通過克隆現有對象來創建新對象對象初始化成本高時的復制操作
單例確保類只有一個實例,提供全局訪問點配置管理器、線程池、緩存系統

二、結構型模式(7種)

目標:組合類或對象形成更大的結構

模式名稱核心思想典型應用場景
適配器轉換接口使不兼容類協同工作舊系統集成、第三方庫封裝
橋接分離抽象與實現,允許獨立變化跨平臺繪圖引擎、設備驅動程序
組合以樹形結構處理整體-部分關系文件系統、GUI容器控件
裝飾器動態添加職責,替代繼承擴展功能IO流增強、游戲裝備系統
外觀為復雜子系統提供統一的高層接口API網關、框架入口類
享元共享細粒度對象,減少內存消耗文字編輯器字符對象、棋牌游戲棋子
代理為其他對象提供訪問代理,控制訪問遠程調用、虛擬文件系統、權限控制

三、行為型模式(11種)

目標:優化對象間的通信與職責分配

模式名稱核心思想典型應用場景
責任鏈將請求沿處理鏈傳遞,直到被處理審批流程、異常處理機制
命令封裝請求為對象,支持撤銷/重做操作事務系統、GUI操作歷史記錄
解釋器定義語法的表示與解釋方式正則表達式引擎、SQL解析器
迭代器提供順序訪問集合元素的方法集合遍歷、樹形結構遍歷
中介者通過中介對象封裝對象間交互聊天室系統、空中交通管制系統
備忘錄捕獲并保存對象內部狀態,支持狀態回滾文檔版本控制、游戲存檔系統
觀察者定義對象間的一對多依賴關系(事件驅動)股票行情通知、GUI事件處理
狀態封裝狀態相關行為,允許運行時狀態切換訂單狀態機、游戲角色狀態管理
策略定義算法族,使其可互相替換支付方式選擇、排序算法切換
模板方法定義算法骨架,子類重寫特定步驟框架擴展點、業務流程標準化
訪問者在不修改類的前提下為類添加新操作編譯器語法樹分析、報表生成器

四、模式選擇指南

  1. 創建型場景

    • 需要靈活控制對象創建過程 → 工廠/建造者模式
    • 全局唯一訪問點 → 單例模式
    • 復雜對象復制 → 原型模式
  2. 結構型場景

    • 接口不兼容 → 適配器模式
    • 動態功能擴展 → 裝飾器模式
    • 資源優化 → 享元模式
  3. 行為型場景

    • 事件驅動系統 → 觀察者模式
    • 算法切換 → 策略模式
    • 狀態管理 → 狀態模式
    • 操作記錄 → 命令模式

五、經典模式對比

對比維度工廠方法 vs 抽象工廠裝飾器 vs 代理策略 vs 狀態
核心區別生產單個對象 vs 對象家族增強功能 vs 控制訪問算法替換 vs 狀態驅動行為變化
擴展方向垂直擴展(子類化)橫向擴展(功能疊加)算法擴展 vs 狀態擴展
典型場景單一產品創建 vs 跨平臺UI組件庫IO流增強 vs 遠程服務代理支付方式選擇 vs 訂單狀態機

六、實際應用建議

  1. 避免過度設計

    • 優先解決實際問題,而非強制使用模式
    • 簡單if-else能解決的不要用策略模式
  2. 模式組合使用

    • 工廠方法+原型:高效創建復雜對象
    • 觀察者+命令:實現事件驅動的撤銷操作
  3. 框架集成

    • Spring:工廠模式(BeanFactory)
    • React:觀察者模式(State更新)
    • Node.js:中間件模式(責任鏈變體)

掌握設計模式的關鍵在于理解其本質思想,而非機械套用。建議結合具體項目實踐,從簡單模式(如策略、觀察者)開始逐步深入,最終達到"無招勝有招"的設計境界。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/77258.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77258.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/77258.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI 推理框架詳解,包含如COT、ReAct、LLM+P等的詳細說明和分類整理,涵蓋其原理、應用場景及對比分析

AI 推理引擎 以下是關于 AI 推理引擎 的詳細說明,涵蓋其定義、類型、核心組件、技術實現、應用場景及挑戰: 1. 推理引擎的定義 推理引擎(Inference Engine)是 AI系統的核心組件,負責根據輸入數據、知識庫或預訓練模…

《探秘鴻蒙分布式軟總線:開啟無感發現與零等待傳輸新時代》

在數字化浪潮中,設備之間的互聯互通成為構建智能生態的關鍵。鴻蒙系統中的分布式軟總線技術,宛如一座橋梁,讓各種智能設備緊密相連。尤其是其實現的設備間無感發現和零等待傳輸功能,更是為用戶帶來了前所未有的便捷體驗&#xff0…

JDBC 與 MyBatis 詳解:從基礎到實踐

目錄 一、JDBC 介紹 二、使用 JDBC 查詢用戶信息 三、ResultSet 結果集 四、預編譯 SQL - SQL 注入問題 五、預編譯 SQL - 性能更高 六、JDBC 增刪改操作 插入數據: 更新數據: 刪除數據: 七、MyBatis 介紹 八、MyBatis 入門程序 引…

基于SpringBoot成績管理系統設計與實現(源碼+文檔+部署講解)

技術范圍:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容:免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論文…

<sql>、<resultMap>、<where>、<foreach>、<trim>、<set>等標簽的作用和用法

目錄 一. sql 代碼片段標簽 二. resultMap 映射結果集標簽 三. where 條件標簽 四. set 修改標簽 五. trim 標簽 六. foreach 循環標簽 一. sql 代碼片段標簽 sql 標簽是 mybatis 框架中一個非常常用的標簽頁,特別是當一張表很有多個字段多,或者要…

《MySQL:MySQL數據庫的基本操作》

1.創建數據庫 CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name 大寫表示關鍵字[]:表示可選項CHARACTER SET ch…

深入簡出:KL散度、交叉熵、熵、信息量簡介、交叉熵損失

學習這些的最終目的 1、量化兩個概率分布的差異 2、推導交叉熵損失 一、KL散度 KL散度就是用來量化兩個概論分布的差異,如何量化? 計算真實概論分布P信息量 和 估計概論分布為Q,但實際概率分布為P時信息量的差值 那么設,概率分…

MySQL:Join連接的原理

連接查詢的執行過程: 確定第一個需要查詢的表【驅動表】 選取代價最小的訪問方法去執行單表查詢語句 從驅動表每獲取到一條記錄,都需要到t2表中查找匹配的記錄 兩表連接查詢需要查詢一次t1表,兩次t2表,在兩表的連接查詢中&…

【Drools+springboot3規則匹配】

文章目錄 一、 業務場景概述二、整體技術架構三、Drools概述1. Drools 簡介2. Drools Rete 算法與flink-cep的區別?2.1 Rete 算法概述2.2 Flink CEP 概述四、代碼實現4.1 導入依賴4.2 從kafka消費數據4.3 核心類,觸發匹配操作并將匹配數據寫入mysql4.4 Drools 管理4.5 相關的…

深入理解 Android Handler

一、引言 Handler 在安卓中的地位是不言而喻的,幾乎維系著整個安卓程序運行的生命周期,但是這么重要的一個東西,我們真的了解它嗎?下面跟隨著我的腳步,慢慢揭開Hanler的神秘面紗吧! 本文將介紹Handler 的運…

讀書筆記 -- MySQL架構

1、MySQL邏輯架構 最上層的服務并不是 MySQL所獨有的,大多數基于網絡的客戶端/服務器的工具或者服務都有類似的架構。比如連接處理、授權認證、安全等等。 第二層架構是 MySQL 比較有意思的部分。大多數 MySQL 的核心服務功能都在這一層包括查詢解析、分析、…

linux 4.14內核jffs2文件系統不自動釋放空間的bug

前段時間在做spi-nor flash項目的時候,使用jffs2文件系統,發現在4.14內核下存在無法釋放空間的bug,后來進行了修復,修復后功能正常,現將修復patch公開,供后來者學習: diff --git a/fs/jffs2/ac…

vue3+vite 實現.env全局配置

首先創建.env文件 VUE_APP_BASE_APIhttp://127.0.0.1/dev-api 然后引入依賴: pnpm install dotenv --save-dev 引入完成后,在vite.config.js配置文件內加入以下內容: const env dotenv.config({ path: ./.env }).parsed define: { // 將…

Oracle 19c部署之手工建庫(四)

#Oracle #19c #手工建庫 手工創建Oracle數據庫(也稱為手工建庫)是指在已經安裝了Oracle數據庫軟件的基礎上,通過手動執行一系列命令和步驟來創建一個新的數據庫實例。這種方法與使用Database Configuration Assistant (DBCA)等工具自動創建數…

【Reading Notes】(8.3)Favorite Articles from 2025 March

【March】 雷軍一度登頂中國首富,太厲害了(2025年03月02日) 早盤,小米港股一路高歌猛進,暴漲4%,股價直接飆到52港元的歷史新高。這一波猛如虎的操作,直接把雷軍的身家拉到了2980億元&#xff0c…

【Python爬蟲基礎篇】--1.基礎概念

目錄 1.爬蟲--定義 2.爬蟲--組成 3.爬蟲--URL 1.爬蟲--定義 網絡爬蟲,是一種按照一定規則,自動抓取互聯網信息的程序或者腳本。另外一些不常使用的名字還有螞蟻、自動索引、模擬程序或者蠕蟲。隨著網絡的迅速發展,萬維網成為大量信息的載體…

C語言超詳細結構體知識

1.自定義類型:結構體的介紹 在之前的博客中,我們簡單介紹過了關于結構體的基本知識,這里我們稍微復習一下。 結構體(struct)是C語言中一種重要的復合數據類型,它允許將不同類型的數據組合成一個整體。 1.1結構體的定義 結構體使…

C++學習:六個月從基礎到就業——內存管理:new/delete操作符

C學習:六個月從基礎到就業——內存管理:new/delete操作符 本文是我C學習之旅系列的第十七篇技術文章,也是第二階段"C進階特性"的第二篇,主要介紹C中動態內存管理的核心操作符——new和delete。查看完整系列目錄了解更多…

15~30K,3年以上golang開發經驗

繼續分享最新的面經,前面發的兩篇大家也可以看看: 「坐標上海,20K的面試強度」「北京七貓,薪資25~35K,瞧瞧面試強度」 今天分享的是golang開發崗面經,要求是3年以上golang開發經驗,薪資為15~3…