Java 之 設計模式

1.單例模式

1. ??餓漢式(Eager Initialization)??
  • ??核心原理??:類加載時立即創建實例,通過靜態變量直接初始化。

  • ??代碼示例??:

public class Singleton {private static final Singleton INSTANCE = new Singleton();private Singleton() {} // 私有構造public static Singleton getInstance() {return INSTANCE;}
}
  • ??特點??:

    • ? ??線程安全??:JVM 類加載機制保證唯一實例。

    • ? ??非延遲加載??:實例在類加載時創建,若未被使用則浪費資源。

  • ??適用場景??:實例小、啟動時即需使用的場景(如配置管理器)

2. ??懶漢式(Lazy Initialization)??
(1) 基礎版(線程不安全)
  • ??代碼示例??:

  • public class Singleton {private static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {instance = new Singleton(); // 多線程下可能重復創建}return instance;}
    }

    ??問題??:多線程并發時可能創建多個實例

3. ??雙重檢查鎖(Double-Checked Locking, DCL)?

? ? ?volatile在DCL中的兩個核心作用:禁止指令重排序和保證內存可見性?

  • ??核心優化??:減少同步次數,兼顧性能與線程安全。

  • ??代碼示例??:

public class Singleton {private static volatile Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}

關鍵點??:

  • ? ??延遲加載??:實例在首次調用時創建。

  • ? ??高效同步??:僅首次創建時加鎖。

  • ?? ??需 volatile??:防止指令重排序導致未初始化對象被使用(JDK 1.5+ 生效)

4. ??靜態內部類(Static Inner Class)??
  • ??原理??:利用 JVM 類加載機制,內部類首次調用時才加載并初始化實例。

  • ??代碼示例??:

public class Singleton {private Singleton() {}private static class Holder {static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance() {return Holder.INSTANCE;}
}
  • 點??:

    • ? ??線程安全??:類加載過程由 JVM 保證同步。

    • ? ??延遲加載??:無額外同步開銷。

  • ??局限??:無法通過參數初始化實例

2.生產者-消費者模式

生產者-消費者模式是一種經典的并發設計模式,用于解決生產者和消費者線程之間的資源協作問題。其核心是??通過共享緩沖區(BlockingQueue)解耦生產與消費邏輯??,平衡兩者的處理速度差異。以下是該模式的實現方式、關鍵要點及最佳實踐

1.核心實現方式??

1. ??基礎版:wait()/notifyAll()??

通過?synchronized塊和?wait()/notifyAll()手動控制線程協作

public class Buffer {private Queue<Integer> queue = new LinkedList<>();private int capacity = 10;public synchronized void produce(int value) throws InterruptedException {while (queue.size() == capacity) { // 緩沖區滿時等待wait();}queue.offer(value);notifyAll(); // 喚醒所有等待線程}public synchronized int consume() throws InterruptedException {while (queue.isEmpty()) { // 緩沖區空時等待wait();}int value = queue.poll();notifyAll(); // 喚醒生產者return value;}
}
2.核心組件與原理??
  1. ??生產者??

    • 負責生成數據(如網絡請求結果、傳感器數據)并存入緩沖區。

    • 當緩沖區滿時,生產者線程自動阻塞(避免資源浪費)。

  2. ??消費者??

    • 從緩沖區取出數據并處理(如更新 UI、保存到數據庫)。

    • 當緩沖區空時,消費者線程自動阻塞(避免空轉)。

  3. ??緩沖區??

    • 作為數據中轉站,通常用??線程安全隊列??實現(如?BlockingQueue)。

    • 特性:容量限制、線程安全的存取操作(put()/take())。

  4. ??同步機制??

    • 確保生產者和消費者不會同時操作緩沖區導致數據競爭(如隊列空/滿時的阻塞喚醒)

3.Android 典型應用場景??
  1. ??異步任務管理??

    • 生產者:后臺線程下載圖片 → 消費者:主線程更新 UI。

    • 示例:HandlerThread+?Handler實現任務隊列(生產者投遞任務,Looper消費任務)。

  2. ??數據流處理??

    • 生產者:攝像頭采集幀 → 消費者:子線程進行圖像識別。

  3. ??高并發請求控制??

    • 限制同時處理的網絡請求數量(如線程池任務隊列。

  4. ??跨進程通信??

    • 通過?IntentService或?WorkManager實現后臺任務生產與消費

3.工廠模式

1. ??簡單工廠模式(靜態工廠)??
  • ??核心??:一個工廠類根據參數創建不同對象。

  • ??Android應用??:

    • BitmapFactory:通過decodeResource()decodeFile()等方法,根據資源類型自動創建Bitmap,隱藏JPEG/PNG等格式的解碼細節。

    • ??通知創建??:統一工廠根據類型生成不同樣式通知(如基礎通知、大圖通知)。


?2. ??工廠方法模式(子類決策)??
  • ??核心??:定義抽象工廠接口,由子類實現具體對象創建。

  • ??Android應用??:

    • LayoutInflater

      • 系統通過onCreateView()抽象方法,讓子類決定如何創建View。

      • ??自定義場景??:通過setFactory2()替換系統控件(如全局將TextView替換為AppCompatTextView),實現兼容性適配。

    • ??RecyclerView??:onCreateViewHolder()由子類決定創建哪種ViewHolder,解耦視圖類型與適配器邏輯。


?3. ??抽象工廠模式(產品家族)??
  • ??核心??:創建一組相關對象(如整套UI組件)。

  • ??Android應用??:

    • Resources體系:根據設備配置(分辨率、語言)自動加載匹配的Drawable、字符串等資源,不同ResourcesImpl生產當前環境所需的資源家族。

    • ??主題切換??:為深色/淺色模式提供配套的按鈕、文本框等UI組件。


? 4. ??開源框架中的應用??
  • ??Retrofit??:Converter.Factory根據接口返回類型選擇數據解析器(如GsonConverterFactory)。

  • ??Glide??:ModelLoaderFactory根據數據類型(URL、File等)創建對應的資源加載器

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

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

相關文章

[激光原理與應用-185]:光學器件 - BBO、LBO、CLBO晶體的全面比較

一、相同點非線性光學晶體屬性BBO、LBO、CLBO均為非中心對稱晶體&#xff0c;具備非線性光學效應&#xff0c;廣泛應用于激光頻率轉換&#xff08;如倍頻、三倍頻、和頻、差頻&#xff09;、光學參量振蕩&#xff08;OPO&#xff09;及電光調制等領域。寬透光范圍三者均覆蓋紫外…

Android APN加載耗時優化可行性分析

背景 根據Android系統底層機制和行業實踐,本文討論 APN 加載耗時從4.2s降至0.8s的數據合理性和技術可行性,需結合具體優化手段和硬件環境綜合分析。 以下是關鍵判斷依據及行業參考: ?? 一、APN加載耗時基準參考 未優化場景的典型耗時 首次開機或重置后:APN需從apns-con…

mysql進階-sql調優

概述優化索引在MySQL初階的課程中已經介紹了索引&#xff0c;我們知道InnoDB存儲引擎使?B樹作為索引默認的數據結構來組織數據&#xff0c;為頻繁查詢的列建?索引可以有效的提升查詢效率&#xff0c;那么如何利?索引編寫出?效的SQL查詢語句&#xff1f;以及如何分析某個查詢…

海量數據處理問題詳解

1.從a&#xff0c;b兩個文件各存放50億個url&#xff08;每個url大小為64B&#xff09;&#xff0c;如何在內存為4G中查找a&#xff0c;b中相同的url 計算各文件存放大小&#xff1a;50億*64B 大約為320G&#xff0c;而內存只有4G&#xff0c;顯然存放不下&#xff0c;此時我們…

AI 記憶管理系統:工程實現設計方案

本文檔為《從“健忘”到“懂我”&#xff1a;構建新一代AI記憶系統》中所述理念的詳細工程實現方案。它將聚焦于技術選型、模塊設計、數據流轉和核心算法&#xff0c;為開發團隊提供清晰的落地指引。 1. 系統架構與技術選型 為實現分層記憶與讀寫分離的設計理念&#xff0c;我們…

Linux驅動學習day26天(RS485)

一、原理通過芯片將232信號轉換成485信號&#xff0c;485表示0和1的方法&#xff1a;Va - Vb 的電壓差在2~6V時表示1&#xff0c;Va - Vb 的電壓差在-2~-6V時表示0。這樣傳輸不容易受到干擾&#xff0c;并且傳輸距離長。我們需要做的事情就是發送&#xff1a;使能DE(driver ena…

從零構建TransformerP1-了解設計

歡迎來到啾啾的博客&#x1f431;。 記錄學習點滴。分享工作思考和實用技巧&#xff0c;偶爾也分享一些雜談&#x1f4ac;。 有很多很多不足的地方&#xff0c;歡迎評論交流&#xff0c;感謝您的閱讀和評論&#x1f604;。 目錄引言1 概念回顧1.1 序列任務1.1.1 將序列變成模型…

JVM 終止機制詳解:用戶線程與守護線程

用戶線程未執行完是否會阻止 JVM 終止&#xff1f;答案是&#xff1a;取決于線程類型。讓我詳細解釋&#xff1a; 核心規則 #mermaid-svg-bg5xpyMAeRWNGGk2 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-bg5xpyMAe…

Linux Vim 常用快捷鍵

Vim中最常用的快捷鍵&#xff0c;熟練掌握它們可以大大提高編輯效率。移動光標h- 左移j- 下移k- 上移l- 右移w- 移動到下一個單詞開頭b- 移動到上一個單詞開頭e- 移動到單詞末尾0- 移動到行首$- 移動到行尾gg- 移動到文件開頭G- 移動到文件末尾:n- 跳轉到第n行插入模式i- 在光標…

【Bellman負環】Cycle Finding

題目翻譯給定一個有向圖&#xff0c;你的任務是判斷它是否包含負環&#xff0c;并給出這樣一個環的示例。輸入 第一行輸入兩個整數 n 和 m&#xff1a;分別表示節點數和邊數。節點編號為 1, 2, ..., n。 接下來 m 行描述邊&#xff0c;每行有三個整數 a, b, c&#xff1a;表示存…

數據結構(六):樹與二叉樹

一、樹的基本概念樹的定義樹&#xff08;Tree&#xff09;是由 n&#xff08;n ≥ 0&#xff09;個節點組成的有限集合&#xff0c;當 n 0 時稱為空樹。非空樹中&#xff1a;有且僅有一個根節點&#xff08;Root&#xff09;&#xff1b;其余節點可以劃分為若干個互不相交的子…

《Linux運維總結:Shell 腳本日志輸出工具》

總結&#xff1a;整理不易&#xff0c;如果對你有幫助&#xff0c;可否點贊關注一下&#xff1f; 更多詳細內容請參考&#xff1a;Linux運維實戰總結 一、Shell 腳本日志輸出工具 1、提供的 logger() 函數是一個非常實用的 Shell 腳本日志輸出工具&#xff0c;它支持帶時間戳和…

select ... for update阻塞

總結阻塞規則&#xff1a;當前事務持有的鎖 (來自 SELECT ... FOR UPDATE)其他事務嘗試的操作是否會被阻塞&#xff1f;原因排他鎖 (X Lock) 在行 R 上SELECT ... FROM ... (普通查詢)否讀快照 (MVCC)&#xff0c;不需要鎖排他鎖 (X Lock) 在行 R 上SELECT ... FROM ... FOR UP…

LangChain4j終極指南:Spring Boot構建企業級Agent框架

LangChain4j Spring Boot 構建企業級 Agent 框架深度指南&#xff08;3000字終極版&#xff09;一、架構設計&#xff1a;面向未來的企業級智能體系統1.1 分層架構設計1.2 核心組件職責1.3 企業級特性設計二、核心模塊深度實現2.1 智能體協作引擎&#xff08;LangGraph4j高級應…

前端基礎之《Vue(29)—Vue3 路由V4》

一、安裝1、命令cnpm install vue-router42、配置映射為src路徑&#xff08;1&#xff09;安裝對應配置cnpm install types/node&#xff08;2&#xff09;配置vite.config.tsimport { defineConfig } from vite import vue from vitejs/plugin-vue import * as path from &quo…

9.2 通過DuEDrawingControl把eDrawing嵌入到C#中顯示

本文介紹如何通過DuEDrawingControl控件在C#的WPF中進行3D的顯示。 DuEDrawingControl在實際應用中可以應用于以下場景: 1.CAD文件預覽:在Winform或WPF應用程序中,用戶可以預覽裝配文件、工程圖文件等,方便進行設計和審核。 2.打印管理:控件支持打印文件的管理,用…

《Vuejs設計與實現》第 13 章(異步組件和函數式組件

目錄 13.1 異步組件的問題與解決方法 13.2 異步組件的實現原理 3.2.1 封裝 defineAsyncComponent 函數 13.2.2 超時與 Error 組件 13.2.3 延遲與 Loading 組件 13.2.4 重試機制 13.3 函數式組件 13.4 總結 在第12章&#xff0c;我們深入探討了組件的基本含義和實現方式…

Python的七大框架對比分析

談到“Python 七大框架”時&#xff0c;通常指 Django、Flask、FastAPI、Tornado、Sanic、AIOHTTP 和 Pyramid 這七位“常駐嘉賓”。它們各有氣質&#xff0c;適合的場景也截然不同。1. DjangoDjango 像一輛全副武裝的重型越野&#xff1a;出廠就配好 ORM、后臺管理、權限、緩存…

Redis中String數據結構為什么以長度44為embstr和raw實現的分界線?

? 一道常見Redis面試題。 ? 在Redis的String數據結構中&#xff0c;當字符串的實際長度小于44且包含非整數字符時底層編碼方式為embstr。當超過44時使用raw底層編碼方式。 ? 那么為什么要以字符串的長度44為分界線呢&#xff1f; 信息一 ? 首先要分析embst…

告別人工巡查,校園空調管理邁入智能物聯高效時代

在“雙碳”戰略深入推進和智慧校園建設加速落地的背景下&#xff0c;學校空調的用電管理已經不再是“開與關”的簡單問題&#xff0c;而是涵蓋了能效優化、安全保障、智慧化管理的綜合課題。藍奧聲科技憑借LPIOT低功耗物聯網、ECWAN邊緣協同網絡等優勢技術&#xff0c;打造出面…