23種設計模式-創建型模式-單例

文章目錄

  • 簡介
  • 問題
    • 1. 確保一個類只有一個實例
    • 2. 為該實例提供全局訪問點
  • 解決方案
  • 示例
    • 重構前:
    • 重構后:
  • 拓展
    • volatile 在單例模式中的雙重作用
  • 總結

簡介

單例是一種創建型設計模式,它可以確保一個類只有一個實例,同時為該實例提供全局訪問點。

問題

單例模式同時解決了兩個問題:

1. 確保一個類只有一個實例

最常見的場景是控制對某些共享資源(例如數據庫或文件)的訪問。假設你已經創建了一個對象,又要創建一個相同類的對象。你不會得到一個新的對象,而是會得到你已經創建的對象。這種行為是無法通過常規構造函數實現,因為構造函數調用在設計上必須始終返回一個新對象。

2. 為該實例提供全局訪問點

全局變量非常方便,但很不安全,因為任何代碼都可能覆蓋這些變量的內容并使程序崩潰。單例模式類似全局變量,允許你從程序中的任何位置訪問某個對象。但是,它還可以保護這個實例不被其他代碼覆蓋。還有一點,為了不讓實現問題1 的代碼分散在各個地方,要把它限制在一個類中,特別是當你的其余代碼已經依賴了它的時候。

解決方案

所有 Singleton 的實現都有這樣兩個共同的步驟:

  • 把默認構造函數設為私有,防止其他對象使用new創建它。
  • 創建一個充當構造函數的靜態創建方法。這個方法會調用私有構造函數來創建一個對象并把它緩存在靜態字段中。這個方法的所有后續調用都會返回緩存好的對象。

如果你的代碼能訪問 Singleton 類,那么它就可以調用 Singleton 的靜態方法。無論何時調用該方法,都會返回相同的對象。

示例

數據庫連接

重構前:

class DBUtil {public Connection getConn() {return DriverManager.getConnection(URL); // 每次新建連接消耗500ms+}
}// 調用端
new DBUtil().getConn().execute("SELECT..."); 
new DBUtil().getConn().execute("UPDATE..."); // 產生兩個獨立連接

重構后:

public class Database {private static volatile Database instance; private Connection connection;// 私有化構造并建立物理連接private Database() {this.connection = DriverManager.getConnection(JDBC_URL); // 真實連接建立}// 雙重檢查鎖定實現線程安全public static Database getInstance() {if (instance == null) { synchronized (Database.class) {if (instance == null) {instance = new Database(); }}}return instance;}// 統一入口方法(可擴展緩存邏輯)public ResultSet query(String sql) {return connection.createStatement().executeQuery(sql); // 所有SQL通過單連接執行}
}

拓展

volatile 在單例模式中的雙重作用

  1. 可見性保證(Visibility)
    阻止線程的本地緩存與主內存數據不同步,確保所有線程讀取到的是最新實例狀態。
  2. 禁止指令重排序(Happens-Before)
    消除 JVM 級別可能的危險優化(非原子化對象構造的三步指令):
未加 volatile 時的風險時序:
A線程: 分配內存 → 寫入未初始化的對象引用(指令排序導致)
B線程: 獲取到非空引用 → 訪問未完成初始化的對象(空指針異常)volatile 強制時序:
分配內存 → 初始化對象 → 寫入引用(三步驟原子性可見)

總結

在這里插入圖片描述

  1. 單例(Sin-gle-ton)類:聲明了一個叫做get-Instance獲的靜態方法來返回實例。單例的構造函數必須為私有。調用獲取實例方法必須是獲取單例對象的唯一方式。

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

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

相關文章

python裁剪nc文件數據

問題描述: 若干個nc文件儲存全球的1850-2014年月尺度的mrro數據(或其他數據),從1850-1到2014-12一共1980個月,要提取出最后35年1980.1~2014.12年也就是420個月的數據。 代碼實現 def aaa(input_file,output_file,bianliang,start_index,en…

深入解析 Spring Framework 5.1.8.RELEASE 的源碼目錄結構

深入解析 Spring Framework 5.1.8.RELEASE 的源碼目錄結構 1. 引言 Spring Framework 是 Java 領域最流行的企業級開發框架之一,廣泛用于 Web 開發、微服務架構、數據訪問等場景。本文將深入解析 Spring Framework 5.1.8.RELEASE 的源碼目錄結構,幫助開…

數據清洗:基于python抽取jsonl文件數據字段

基于python抽取目錄下所有“jsonl”格式文件。遍歷文件內某個字段進行抽取并合并。 import os import json import time from tqdm import tqdm # 需要先安裝:pip install tqdmdef process_files():# 設置目錄路徑dir_path r"D:\daku\關鍵詞識別\1623-00000…

Windows 下使用 Docker 部署 Go 應用與 Nginx 詳細教程

一、環境準備 1. 安裝必要軟件 Docker Desktop for Windows 下載地址:Docker Desktop: The #1 Containerization Tool for Developers | Docker 安裝時勾選"使用 WSL 2 引擎"(推薦) WSL 2(Windows Subsystem for Li…

C# .net ai Agent AI視覺應用 寫代碼 改作業 識別屏幕 標注等

C# net deepseek RAG AI開發 全流程 介紹_c# 向量處理 deepseek-CSDN博客 視覺多模態大模型 通義千問2.5-VL-72B AI大模型能看懂圖 看懂了后能干啥呢 如看懂圖 讓Agent 寫代碼 ,改作業,識別屏幕 標注等等。。。 據說是目前最好的免費圖片識別框架 通…

Docker多階段構建:告別臃腫鏡像的終極方案

Docker多階段構建:告別臃腫鏡像的終極方案 你是否遇到過這樣的問題:一個簡單的應用,Docker鏡像卻高達1GB?編譯工具、臨時文件、開發依賴全被打包進去,導致鏡像臃腫且不安全。 多階段構建(Multi-stage Build) 就是為解決這一問題而生——它像搬家時“只帶必需品”,讓生…

大模型應用開發之大模型工作流程

一:大模型的問答工作流程 1.1: 分詞和向量化 如上圖所示,我們如果讓大模型去回答問題,首先我們會輸入一些文字給到大模型,大模型本質上是個數學模型,它是理解不了人類的整句話的,所以它會把我們的對應的句…

SpringMVC 請求處理

SpringMVC 請求處理深度解析:從原理到企業級應用實踐 一、架構演進與核心組件協同 1.1 從傳統Servlet到前端控制器模式 SpringMVC采用前端控制器架構模式,通過DispatcherServlet統一處理請求,相比傳統Servlet的分散處理方式,實…

12屆藍橋杯—貨物擺放

貨物擺放 題目描述 小藍有一個超大的倉庫,可以擺放很多貨物。 現在,小藍有 nn 箱貨物要擺放在倉庫,每箱貨物都是規則的正方體。小藍規定了長、寬、高三個互相垂直的方向,每箱貨物的邊都必須嚴格平行于長、寬、高。 小藍希望所…

Reactor/Epoll為什么可以高性能?

在 Reactor 模式中使用 epoll_wait 實現低 CPU 占用率的核心原理是 ?事件驅動的阻塞等待機制,而非忙等待。以下通過分步驟解析其工作原理和性能優勢: void network_thread() {int epoll_fd epoll_create1(0);epoll_event events[MAX_EVENTS];// 添加U…

批量優化與壓縮 PPT,減少 PPT 文件的大小

我們經常能夠看到有些 PPT 文檔明明沒有多少內容,但是卻占用了很大的空間,存儲和傳輸非常的不方便,這時候通常是因為我們插入了一些圖片/字體等資源文件,這些都可能會導致我們的 PPT 文檔變得非常的龐大,今天就給大家介…

Java基礎 3.22

1.break練習 //1-100之內的數求和&#xff0c;求當和第一次大于20的當前數i public class Break01 {public static void main(String[] args) {int n 0;int count 0;for (int i 1; i < 100; i) {count i;System.out.println("當前和為" count);if (count &g…

高性能MySQL筆記

高性能MySQL筆記 《高性能MySQL》第1章 MySQL架構**第一章核心知識點總結****多選題**多選題答案**答案與詳解總結** 《高性能MySQL》第2章 可靠性程世界中的監控核心知識點多選題答案及解析重點鞏固方向 《高性能MySQL》第3章 Performance Schema**第三章核心知識點總結****多…

導游職業資格考試:從迷茫到清晰的備考指南

當你決定報考導游職業資格考試時&#xff0c;可能會感到有些迷茫&#xff0c;不知道從何處入手。別擔心&#xff0c;這份備考指南將帶你從迷茫走向清晰。? 第一步&#xff0c;全面了解考試。導游職業資格考試分為筆試和面試。筆試的四個科目各有特點&#xff0c;《政策與法律…

【BFS】《BFS 攻克 FloodFill:填平圖形世界的技術密碼》

文章目錄 前言例題一、 圖像渲染二、 島嶼數量三、島嶼的最大面積四、被圍繞的區域 結語 前言 什么是BFS&#xff1f; BFS&#xff08;Breadth - First Search&#xff09;算法&#xff0c;即廣度優先搜索算法&#xff0c;是一種用于圖或樹結構的遍歷算法。以下是其詳細介紹&am…

Linux安裝MySQL數據庫并使用C語言進行數據庫開發

目錄 一、前言 二、安裝VMware運行Ubuntu 1.安裝VMware 2.使用VMware打開Ubuntu 三、配置VMware使用網卡 1.添加NAT網卡 四、Linux下安裝MySQL數據庫 五、安裝MySQL開發庫 六、演示代碼 sql_connect.c sql_connect.h main.c中數據庫相關代碼 結尾 一、前言 由于最…

ROS2 部署大語言模型節點

4GB GPU的DeepSeek-Coder 1.3B模型&#xff0c;并且它已經被量化或優化過。以下是具體的步驟&#xff1a; 安裝必要的依賴項&#xff1a; pip install transformers torch grpcio googleapis-common-protos創建一個新的ROS 2包&#xff1a; cd ~/ros2_ws/src ros2 pkg creat…

本人設計的最完全的光壓發電機模型

雙螺旋轉子光壓發電機結構模型 作者&#xff1a;龔仕成 單位&#xff1a;四川水利職業技術學院電力工程系 日期&#xff1a;2024年3月25日 摘要 本文提出了一種基于梯形螺旋溝槽多層復合材料轉子的光壓發電機結構模型&#xff0c;通過光-機-電協同設計實現高效能量轉換。通…

六十天Linux從0到項目搭建(第五天)(file、bash 和 shell 的區別、目錄權限、默認權限umask、粘滯位、使用系統自帶的包管理工具)

1. file [選項] 文件名 用于確定文件類型的實用工具。它會通過分析文件內容&#xff08;而不僅僅是文件擴展名&#xff09;來判斷文件的實際類型 示例輸出解析 $ file /bin/bash /bin/bash: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, i…

基于大模型預測的初治菌陽肺結核診療方案研究報告

目錄 一、引言 1.1 研究背景與意義 1.2 研究目的 二、初治菌陽肺結核概述 2.1 疾病定義與病理機制 2.2 流行病學特征 2.3 傳統診療方法與局限性 三、大模型在初治菌陽肺結核預測中的應用原理 3.1 大模型技術簡介 3.2 數據收集與預處理 3.3 模型構建與訓練 3.4 模型…