領悟8種常見的設計模式

很多 Java 初學者覺得設計模式 “抽象難學”,其實是沒抓住核心邏輯 —— 設計模式不是 “炫技代碼”,而是前輩們總結的 “解決高頻復雜問題的通用思路”,好吧,你可以過一遍了解這些大概是個什么東西

不求我們能夠完全理解,畢竟我們小時候家人跟我們說人生大道理我們也不太當回事

一、先明確:Java 設計模式到底是什么?

一句話總結核心:設計模式是 “針對 Java 開發中重復出現的復雜場景,前輩們總結的、可復用的代碼解決思路”。

你可以從 3 個角度理解,瞬間消除 “抽象感”:

  1. 不是 “固定代碼模板”,而是 “解決問題的思路”
    比如 “單例模式” 的核心思路是 “讓一個類只創建一個對象”,具體代碼可以有
    “雙重檢查鎖”“靜態內部類” 等多種寫法,但 “只存一個實例” 的思路不變。

生活類比:“做米飯要先加水再加熱” 是思路,具體用電飯鍋還是高壓鍋,是實現方式 —— 思路統一,實現靈活。

  1. 只解決 “特定復雜問題”,不是 “萬能工具”
    設計模式針對的是 “不用就會踩坑” 的場景:比如 “想避免重復創建對象浪費資源”“想動態切換支付方式又不想寫一堆 if-else”“想加日志又不改動原有業務代碼”。
    簡單場景(比如一個工具類只提供 1 個靜態方法)不需要設計模式,直接寫簡單代碼更高效。

  2. 核心價值是 “讓代碼易維護、易擴展”
    沒有設計模式的代碼,后期迭代會變成 “一團亂麻”:比如新增支付方式要改原有代碼、加日志要在每個方法里寫重復邏輯。
    設計模式能讓代碼 “解耦”—— 新增功能不用改老代碼、增強邏輯不侵入業務,后期維護不用 “牽一發而動全身”。

二、Java 開發中最常用的設計模式有哪些?

設計模式官方有 23 種,但 Java 開發者日常用得最多、面試問得最頻繁的,集中在3 大類 8 種,按 “解決的核心問題” 分類,一目了然:
在這里插入圖片描述

三、創建型模式

1. 單例模式(Singleton)—— 一個類只創建一個對象

  • 定義
    保證一個類在整個 Java 程序運行過程中,只有一個實例對象并且提供一個全局統一的訪問入口
  • 生活例子
    公司的 “CEO”—— 全公司只有 1 位 CEO,所有部門對接 CEO 時,都只能找這同一個人,不可能同時存在兩位 CEO;而且所有人都知道 “找 CEO 要通過秘書(全局入口)”,不能自己 “造一個 CEO”。
  • 業務場景
    日志工具類 :日志需要統一寫入文件 / 數據庫,多實例會導致日志內容錯亂;
    線程池: 線程池需要控制線程數量,多實例會導致線程過多,耗盡服務器資源;
    數據庫連接池:數據庫連接數有限,多實例會導致連接超標,數據庫拒絕訪問。

2. 簡單工廠模式(Simple Factory)—— 統一創建同一類對象

  • 定義
    定義一個 “工廠類”,由工廠統一創建同一類別下的所有對象(比如各種支付方式、各種日志類型),外部不用關心對象的創建細節,只需要告訴工廠
    “要什么”,就能拿到對應的對象。
  • 生活例子
    奶茶店的 “收銀臺”—— 顧客不用自己動手做奶茶(不用關心奶茶怎么煮、怎么加配料),只需要告訴收銀臺(工廠)“要珍珠奶茶” 或
    “要水果茶”,收銀臺就會給顧客對應的奶茶(產品)。
  • 業務場景
    支付系統:需要創建微信支付、支付寶支付、銀聯支付對象,用工廠根據用戶選擇的支付方式統一創建;
    日志系統:需要創建文件日志、控制臺日志、數據庫日志對象,用工廠根據配置統一創建;
    文檔導出:需要創建 Excel 導出、PDF 導出、Word 導出對象,用工廠根據用戶選擇的格式統一創建。

3. 建造者模式(Builder)—— 分步創建復雜對象

  • 定義
    針對 “有多個屬性(尤其是可選屬性)的復雜對象”,將對象的創建過程拆分成多個步驟,逐步設置屬性,最后統一構建出完整對象,避免創建出
    “屬性不完整” 的對象。
  • 生活例子
    組裝電腦 —— 電腦有 “CPU、內存、硬盤” 等必選屬性(沒有這些電腦無法運行),還有 “顯卡、鍵盤、鼠標” 等可選屬性(沒有也能運行,但體驗差)。組裝時,必須先裝必選部件,再按需裝可選部件,最后拼成完整電腦。
  • 業務場景
    訂單創建:訂單有 “訂單號、商品 ID、金額” 等必選屬性,有 “收貨地址、優惠券、備注” 等可選屬性;
    用戶注冊:用戶有 “手機號、密碼” 等必選屬性,有 “昵稱、頭像、生日” 等可選屬性;
    文檔生成:文檔有 “標題、內容” 等必選屬性,有 “作者、日期、封面” 等可選屬性。

四、結構型模式

1. 代理模式(Proxy)—— 給對象加 “增強層”

  • 定義
    給 “目標對象”(核心業務對象)創建一個 “代理對象”,外部通過代理對象訪問目標對象,在訪問前后可以添加額外邏輯(比如日志、權限、事務),不修改目標對象的代碼。
  • 生活例子
    明星的 “經紀人”—— 粉絲想找明星商演(訪問目標對象),不能直接聯系明星,必須通過經紀人(代理對象):經紀人會先 “篩選商演需求”(權限校驗)、“記錄行程”(日志),再安排明星去商演(調用目標對象方法),商演后還會 “結算費用”(后續增強)。
  • 業務場景
    Spring AOP:給 Service 方法加事務(代理在方法前開啟事務,方法后提交 / 回滾);
    日志記錄:給 Controller 方法加訪問日志(代理在方法前記錄請求參數,方法后記錄返回結果);
    權限校驗:給敏感接口加權限(代理在方法前判斷用戶是否有權限,無權限則拒絕)。

2. 策略模式(Strategy)—— 動態切換邏輯,消除 if-else

  • 定義
    將 “不同的算法 / 邏輯” 封裝成獨立的 “策略類”策略類之間可以互相替換,外部根據場景動態選擇對應的策略,不用在代碼中寫大量 if-else。
  • 生活例子
    出行方式選擇 —— 去公司可以選 “地鐵”“公交”“打車” 三種策略:趕時間選 “打車”,想省錢選 “公交”,平衡時間和成本選 “地鐵”。每種策略的 “路線、費用、時間” 獨立且可以隨時切換
  • 業務場景
    訂單折扣:普通用戶無折扣、會員 9 折、VIP8 折,根據用戶等級動態選策略;**
    支付方式 :微信、支付寶、銀聯支付,根據用戶選擇動態選策略;
    排序算法:數據量小用 “冒泡排序”,數據量大用 “快速排序”,根據數據量動態選策略。

3. 裝飾器模式(Decorator)—— 動態給對象加功能

  • 定義
    在不修改原有對象代碼的前提下,通過 “包裝” 的方式給對象動態添加新功能,并且可以靈活組合多個功能(比繼承更靈活)。
  • 生活例子
    咖啡店的 “咖啡加配料”—— 一杯美式咖啡(基礎對象)可以加奶泡(裝飾器 1)、加糖(裝飾器 2)、加冰(裝飾器 3),每種配料都是一個獨立的 “裝飾”,可以自由組合(比如 “美式 + 奶泡 + 糖”“美式 + 冰”),且不改變咖啡本身的制作邏輯。
  • 業務場景
    日志增強:基礎日志功能可以動態添加 “時間戳裝飾”“用戶 ID 裝飾”“模塊名稱裝飾”;
    數據加密:基礎數據傳輸可以動態添加 “Base64 加密裝飾”“MD5 加密裝飾”
    IO 流擴展:Java 中的BufferedInputStream就是FileInputStream的裝飾器,添加了緩沖功能。

五、行為型模式

1. 適配器模式(Adapter)—— 讓不兼容的類一起工作

  • 定義
    將一個類的接口轉換成客戶端期望的另一個接口,使原本因接口不兼容而無法一起工作的類能夠協同工作。
  • 生活例子
    手機充電器 “轉接頭”—— 安卓手機充電器(原有接口)不能直接給蘋果手機(目標接口)充電,用一個轉接頭(適配器)就能讓安卓充電器給蘋果手機充電,轉接頭內部完成 “安卓接口” 到 “蘋果接口” 的轉換。
  • 業務場景
    老系統升級:老系統返回 XML 格式數據,新系統需要 JSON 格式,用適配器轉換;
    第三方接口集成:第三方接口返回的字段名(如user_name)和本地系統(如username)不一致,用適配器映射;
    舊 API 兼容:項目中原來的Payment接口有pay(double amount)方法,新引入的支付 SDK 方法是doPayment(BigDecimal money),用適配器適配。

2. 觀察者模式(Observer)—— 實現對象間的動態通知

  • 定義
    當一個對象(被觀察者)的狀態發生變化時,所有依賴它的對象(觀察者)會自動收到通知并更新,實現 “一對多” 的動態通信。
  • 生活例子
    微信公眾號 —— 你關注的公眾號(被觀察者)發布新文章時,所有關注該公眾號的用戶(觀察者)都會收到推送通知,用戶可以選擇閱讀或忽略,但公眾號不需要知道具體有哪些用戶關注它。
  • 業務場景
    電商庫存預警:商品庫存低于閾值時,自動通知 “庫存管理系統”“訂單取消系統”“用戶提醒系統”;
    消息隊列:生產者發送消息到隊列(被觀察者),所有訂閱該隊列的消費者(觀察者)自動接收消息;
    GUI 事件處理:按鈕(被觀察者)被點擊時,所有注冊了點擊事件的監聽器(觀察者)自動執行回調。

總結:8 種常用設計模式的核心價值?

這 8 種設計模式覆蓋了 Java 開發中 “創建對象、組織結構、協調行為” 的核心場景,記住它們的核心解決點:

在這里插入圖片描述

實際開發中,不必刻意追求 “用了多少模式”,而是當遇到對應痛點時,能想到 “用哪種模式可以更優雅地解決”—— 這才是學設計模式的最終目的。

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

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

相關文章

復雜BI報表SQL

復雜SQL 一行多個人員,平均瓜分總產量。 -- 西寧硅料三期 with b as ( select(row_number() OVER(PARTITION BY t1.tool ORDER BY t1.tool ) - 1) AS help_topic_id from((select1 AS tool union allselect1 AS tool union allselect1 AS tool union allselect1 AS …

bin log 和 redo log有什么區別

問題bin log 和 redo log有什么區別我的回答首先,這兩種日志的作用不同。redo log是InnoDB引擎特有的,主要用于崩潰恢復,保證事務的持久性。而bin log是MySQL服務層的日志,主要用于主從復制和數據恢復。從層次上看,red…

導入文件允許合并表格

本來呢,已經有幾年沒咋寫博客了,但是好像網上沒什么好的合并導入可以抄的,周末加班了一天弄出來了,想一想也不算造輪子,可以露一手出來,最近也挺喜歡寫注釋的,應該方便大家抄的public class Tra…

WebIDEPLOY 技術驅動櫻桃溯源管理系統的價值重塑與落地實踐—— 以櫻桃溯源管理系統構建產業信任體系的路徑探索

一、WebIDEPLOY 技術支撐下的櫻桃溯源系統核心架構櫻桃種植從開花到銷售的全流程數據記錄,需要兼顧專業性與易操作性,WebIDEPLOY 技術以 “零代碼降低門檻、云原生優化成本” 的特性,成為連接數字工具與櫻桃種植的關鍵紐帶。系統核心架構圍繞…

零知開源——基于STM32F407VET6實現ULN2003AN驅動28BYJ-48步進電機控制系統

?零知IDE 是一個真正屬于國人自己的開源軟件平臺,在開發效率上超越了Arduino平臺并且更加容易上手,大大降低了開發難度。零知開源在軟件方面提供了完整的學習教程和豐富示例代碼,讓不懂程序的工程師也能非常輕而易舉的搭建電路來創作產品&am…

如何多個手機設備的實現不同公網IP

為了避免多個手機設備使用相同的公網IP地址導致平臺檢測關聯,可以通過以下方法實現不同公網IP的分配和管理. 一、移動網絡(SIM 卡)方案 1.移動數據與Wi-Fi切換:通過切換移動數據和不同Wi-Fi網絡(如家庭Wi-Fi、公共Wi-F…

沙箱操作指南

這是一份通用且詳細的沙箱操作指南。沙箱(Sandbox)是一種安全隔離環境,常用于測試未經驗證的代碼、軟件、文件或訪問可疑網址,而不會對真實系統造成危害。 本指南將分為以下幾個部分: 沙箱是什么? 為什么需要使用沙箱? 如何使用沙箱?(三種主要類型) 最佳實踐與注意事…

【數字IC后端】引導時鐘樹CTS的生成方向之anchor driver

如何控制數字IC后端CTS的生成方向?我們可以引入anchor driver來實現引導。景芯12nm車規APR實戰中,我們可以看到,絕大部分的sink都受控于xxxx_tessent_occ_clk_cpu_inst/tessent_persistent_cell_clock_out_mux/C10_ctmi_1這個mux,…

「Java EE開發指南」如何使用MyEclipse啟用自動JSP驗證?

自動JSP驗證可以在兩種情況下啟用,在本文中您將學習如何正確使用它。 該特性在MyEclipse中可用。 MyEclipse v2025.1離線版下載 您可以在保存JSP編輯器的內容或執行“Clean”操作時啟用自動JSP驗證。要進行正確的驗證,必須使用完整的JDK JVM啟動MyEcl…

leetcode_73 矩陣置零

1. 題意 給定一個 m x n 的矩陣,如果一個元素為 0 ,則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。 2. 題解 想不到O(1)的空間復雜度的做法, 只有抄抄題解這樣子才能維持的了生活。 2.1 暴力 維護兩個標記數組,分…

優雅地實現ChatGPT式的打字機效果:Spring Boot 流式響應

01 引言 之前專門介紹過流式響應的數據的接收、發送以及使用SSE由服務端推送數據的文章,但是要求前端必須使用EventSource訂閱實現。 有沒有通過直接通過瀏覽器訪問或者Fetch API直接調用的方式呢?效果還能和ChatGPT一樣,實現打字機的效果呢&…

Git 刪除文件

在 Git 中,刪除文件同樣被視為一種修改操作。下面我們通過實際操作演示如何刪除文件。假設要刪除文件 file5,如果你直接在文件系統中執行了刪除:這種直接刪除的方式并不會在 Git 中生效,反而會導致工作區與版本庫不一致。使用 git…

虛幻基礎:角色變換角色視角蒙太奇運動

能幫到你的話,就給個贊吧 😘 文章目錄角色視角機臂使用pawn控制旋轉:旋轉體將失去作用旋轉體攝像機:可以使用旋轉體控制:pawn不起作用角色變換角色移動:由移動組件控制移動方向:給組件任意一個方…

【LeetCode】31. 下一個排列

文章目錄31. 下一個排列題目描述示例 1:示例 2:示例 3:提示:解題思路1. 問題本質與字典序回顧2. 經典算法三步曲(必須原地、常數空間)3. 直觀示例與過程可視化4. 與“62. 不同路徑”風格對應的分析維度4.1 …

CVPR2025丨VL2Lite:如何將巨型VLM的“知識”精煉后灌入輕量網絡?這項蒸餾技術實現了任務專用的極致壓縮

關注gongzhonghao【CVPR頂會精選】小模型(Small Models)通常指參數量較小、計算與存儲成本更低的深度學習模型。近年來,它們在移動端部署、邊緣計算和隱私保護等場景中快速發展,逐漸成為大模型的輕量化補充。隨著蒸餾、剪枝、量化…

【SystemUI】鎖屏來通知默認亮屏Wake模式

一、問題描述 基于 Android 14平臺,鎖屏狀態下來通知時默認是進入Doze模式,此時屏幕不能點擊只能查看通知信息且很快滅屏,用戶體驗不是很好,要求修改為通知直接亮屏。二、問題分析 梳理鎖屏狀態下(特指設備息屏或處于D…

高并發寫入、毫秒級查詢——盤古信息攜手 TDengine 時序數據庫解決六大技術挑戰

小T導讀:廣東盤古信息科技股份有限公司(下文簡稱盤古信息)成立于 2005 年,是一家基于工業互聯網平臺的數字化管理解決方案供應商,公司自主研發的 IMS(數字化智能制造系統)可為離散、流程及混合制…

Unity 打包 iOS,Xcode 構建并上傳 App Store

一、準備工作(環境、賬號、證書與項目基礎)系統與工具macOS:使用與最新 Xcode 兼容的版本。Xcode:從 Mac App Store 安裝最新穩定版(建議與當前 App Store 必需的 Xcode 主版本保持一致)。Unity&#xff1a…

Windows系統安裝stata軟件教程

1、解壓縮2、點擊next3、選擇第一個,然后next4、這里隨便填寫就行5、選擇stataMP,然后next6、這里改個路徑,例如D:\Program Files\Stata18\7、這里不用管,選擇next8、點擊install,開始安裝過程9、安裝過程展示。10、最…

Android 開發 - 數據共享(數據共享、內容提供者實現、動態權限申請)

一、數據共享 1、內容提供者 內容提供者 ContentProvider 為 APP 存取內部數據提供統一的外部接口,讓不同的應用之間得以共享數據2、流程理解 Client APP 將用戶的輸入內容通過 ContentProvider 跨進程通信傳遞給 Server APP3、數據訪問 利用 ContentProvider 只實現…