【Java SE】單例設計模式

參考筆記:深入理解Java設計模式:單例模式及其餓漢式與懶漢式的對比,-CSDN博客

目錄

1.什么是設計模式

2.經典設計模式

3.單例設計模式(static屬性/方法經典使用場景 )

3.1?餓漢式單例模式

3.2 懶漢式單例模式

4.補充


1.什么是設計模式

設計模式是在大量的實踐中總結和理論化之后優的代碼結構、編程風格、以及解決問題的思考方式

2.經典設計模式

經典的設計模式共 23 種?

① 創建型模式,共 5 種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式

② 結構性模式,共 7 種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式

③?行為型模式,共 11 種:策略模式、模板方法模式、觀察者模式、迭代器模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式


3.單例設計模式(static屬性/方法經典使用場景 )

單例設計模式:采取一定的方法保證在整個軟件系統中,對某個類只能存在一個對象實例,并且該類只提供一個取得其對象實例的方法

單例設計模式主要有以下三個特點:

① 只能有一個實例
② 必須自己創建自己的唯一實例? 
③ 必須給所有其他對象提供這一實例

3.1?餓漢式單例模式

① 特點:立即加載,類加載時就會把 single 創建完畢

②?優點:實現簡單,不會有多線程安全問題

③?缺點:當類加載時,會初始化 static 變量,靜態變量被創建并分配內存空間。從這以后,這個 sttaic 的實例便一直占著這塊內存,直到類被卸載時,靜態變量被銷毀,并解釋所占用的內存空間。因此餓漢式單例模式在特定條件下會耗費內存

public class Test {public static void main(String[] args) {Singleton single1 = Singleton.getInstance();Singleton single2 = Singleton.getInstance();System.out.println(single1==single2);//trueSystem.out.println(single1);System.out.println(single2);}
}//餓漢式單例模式
class Singleton {private String name;// 1.私有化構造器,防止直接在其他類new對象private Singleton(String name) {this.name = name;}// 2.內部提供一個當前類的實例// 4.為了能夠在靜態方法getInstance中返回變量,single也必須靜態化(靜態方法只能調用靜態屬性/方法)private static Singleton single = new Singleton("小馬");// 3.提供公共的靜態的方法,返回當前類的對象public static Singleton getInstance() {return single;}@Overridepublic String toString() {return "Singleton{" +"name='" + name + '\'' +'}';}
}

3.2 懶漢式單例模式

先看代碼,后面再總結

public class Test {public static void main(String[] args) {//single1和single2是同一對象Singleton single1 = Singleton.getInstance();Singleton single2 = Singleton.getInstance();System.out.println(single1==single2);//trueSystem.out.println(single1);System.out.println(single2);}
}//懶漢式單例模式
class Singleton {// 1.私有化構造器private Singleton() {}// 2.內部提供一個當前類的實例// 4.此實例也必須靜態化private static Singleton single;// 3.提供公共的靜態的方法,返回當前類的對象public static Singleton getInstance() {if(single == null) {single = new Singleton();}return single;}
}
/*輸出結果
true
Singleton@1b6d3586
Singleton@1b6d3586
*/

① 特點:延遲加載,只有在調用靜態方法 getInstancesingle 才被分配內存空間

②?優點:實現簡單

? ? (1)餓漢式在類加載時就創建了對象實例,但是可能這個對象后面沒有用或者用的少,就造成浪費;

? ? (2)懶漢式在類加載時?static 實例未被創建和分配內存空間,只有當靜態方法 getInstance 第一次被調用時才返回對象,再次調用時,返回的也是上次調用的對象,因此保證了僅一個實例對象

③?缺點:在多線程環境中,該實現方法存在線程安全問題,不能保證單例的唯一性

說明:?3 個線程同時進入 if 語句中,new3 次,破環了單例設計模式的原則?

4.補充

JavaSE 類庫中,java.lang.Runtime 就是經典的單例模式,且是餓漢式的?

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

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

相關文章

【day2】數據結構刷題 棧

一 有效的括號 給定一個只包括 (,),{,},[,] 的字符串 s ,判斷字符串是否有效。 有效字符串需滿足: 左括號必須用相同類型的右括號閉合。左括號必須以正確的順序閉合。每個右括號都有一個對應的…

藍橋杯 勁舞團

問題描述 小藍最近迷上了一款名為 “勁舞團” 的游戲。 在游戲中,只要按照給出的鍵位提示依次按出對應的鍵位,游戲人物便可以跟隨節奏跳舞。 對于連續的 K 次正確敲擊,如果任意連續兩次敲擊之間的時間間隔都小于等于 1 秒(即 1…

數據庫數值函數詳解

各類資料學習下載合集 ??https://pan.quark.cn/s/8c91ccb5a474?? 數值函數是數據庫中用于處理數值數據的函數,可以用于執行各種數學運算、統計計算等。數值函數在數據分析及處理時非常重要,能夠幫助我們進行數據的聚合、計算和轉換。在本篇博客中,我們將詳細介紹常用的…

關于金融開發領域的一些專業知識總結

目錄 1. 交易生命周期 1.1 證券交易所 1.1.1 交易前 1) 訂單生成(Order Generation) 2) 訂單管理(Order Management) 1.1.2 交易執行 3) 交易匹配(Trade Matching) 1.1.3 交易后 4) 交易確認&…

Leetcode 3495. Minimum Operations to Make Array Elements Zero

Leetcode 3495. Minimum Operations to Make Array Elements Zero 1. 解題思路2. 代碼實現 題目鏈接:3495. Minimum Operations to Make Array Elements Zero 1. 解題思路 這一題的話核心就是統計對任意自然數 n n n,從 1 1 1到 n n n當中所有的數字對…

Vue 3 + TypeScript 實現視頻播放與字幕功能:集成西瓜播放器 XGPlayer

文章目錄 1. 前言:視頻播放器的重要性2. 準備工作2.1 安裝 Vue 3 項目2.2 安裝 XGPlayer 和相關依賴 3. 實現視頻播放3.1 初始化 XGPlayer 4. 添加字幕功能4.1 配置字幕 4.2 字幕文件格式5. 增加交互性完整的代碼,僅供參考6. 總結 在現代 Web 開發中&…

MacOS安裝 nextcloud 的 Virtual File System

需求 在Mac上安裝next cloud實現類似 OneDrive 那樣,文件直接保存在服務器,需要再下載到本地。 方法 在 官網下載Download for desktop,注意要下對版本,千萬別下 Mac OS默認的那個。 安裝了登錄在配置過程中千萬不要設置任何同…

.NET 9 徹底改變了 API 文檔:從 Swashbuckle(Swagger) 到 Scalar

示例代碼下載:https://download.csdn.net/download/hefeng_aspnet/90404652 摘要 API 文檔是現代軟件開發的支柱。隨著 .NET 9 從 Swashbuckle 轉向 Microsoft.AspNetCore.OpenApi,開發人員需要新的策略來保持高效。本文探討了這些變化,并介…

深入剖析Java虛擬機(JVM):從零開始掌握Java核心引擎

📌 引言:為什么每個Java開發者都要懂JVM? 想象你是一名賽車手,Java是你的賽車,而JVM就是賽車的引擎。 雖然你可以不關心引擎內部構造就能開車,但要想在比賽中獲勝,必須了解引擎如何工作&#…

怎么連接linux服務器的桌面

一、使用 VNC(Virtual Network Computing) 1. 服務器端配置(Ubuntu 22.04 示例) # 安裝 VNC 服務器(以 TigerVNC 為例) sudo apt update sudo apt install tigervnc-standalone-server tigervnc-xorg-ext…

elasticsearch 通用筆記

文章目錄 一、前言二、內容說明1、目錄簡介2、本文例子前提內容 三、操作內容1、設置ES為服務2、查看健康度參數解析 3、索引相關查詢3.1、查詢指定索引內容3.1.1、匹配查詢3.1.2、精確匹配(不嘗試分詞)3.1.3、范圍查詢3.1.4、id查詢3.1.5、通配符及前綴…

windows安裝配置FFmpeg教程

1.先訪問官網:https://www.gyan.dev/ffmpeg/builds/ 2.選擇安裝包Windows builds from gyan.dev 3. 下滑找到release bulids部分,選擇ffmpeg-7.0.2-essentials_build.zip 4. 然后解壓將bin目錄添加path系統變量:\ffmpeg-7.0.2-essentials_bui…

強大的AI網站推薦(第二集)—— V0.dev

網站:V0.dev 號稱:前端開發神器,專為開發人員和設計師設計,能夠使用 AI 生成 React 代碼 博主評價:生成的UI效果太強大了,適合需要快速創建UI原型的設計師和開發者 推薦指數:🌟&…

c#知識點補充4

1.發布者訂閱模式 發布者 訂閱者 倆者直接的關聯使用

01、聊天與語言模型

一、簡單說明模型 LLM目前有兩種API提供 LanguageModel:接收一個a作為輸入并返回一個b作為輸出,這種是已經過時的ChatLanguageModel:接收多個輸入,然后返回相應的輸出 ChatLanguaggeModel是LangChain4j中LLM交互低級API&#x…

SQL的DCL,DDL,DML和DQL分別是什么

SQL(Structured Query Language)包括以下四種主要語言類別,分別用于不同的數據庫操作: 1. DCL(Data Control Language,數據控制語言) 用于控制數據庫訪問權限和安全。 常見命令: …

spring boot maven一欄引入本地包

1、在項目跟目錄下建立文件夾&#xff0c;比如libs 2、maven依賴 <dependency><groupId>com.hikvision.ga</groupId><artifactId>artemis-http-client</artifactId><version>1.1.10</version><scope>system</scope>&l…

連續型隨機變量及其分布

連續型隨機變量 數學公式可以看作一門精確描述事物的語言&#xff0c;比語言尤其是漢語的模糊性精確多了&#xff01;離散型數據的處理可以通過枚舉和相加進行處理。而連續型數據則沒有辦法這樣處理。我們必須要通過函數和取值區間還有微積分計算。 &#xff3b;定義1&#x…

AI重構SEO關鍵詞優化路徑

內容概要 人工智能技術的深度應用正在推動SEO優化進入全新階段。傳統關鍵詞優化依賴人工經驗與靜態規則&#xff0c;存在效率瓶頸與策略滯后性缺陷。AI技術通過智能語義分析系統&#xff0c;能夠穿透表層詞匯限制&#xff0c;精準捕捉用戶搜索意圖的語義關聯網絡&#xff0c;結…

turnjs圖冊翻書效果

npm install https://github.com/igghera/turn.js.git //或者 npm install turn.js //import $ from "jquery"; //記得引入jquery import turn.js; // 引入 Turn.jsimport turn from "/utils/turn.min.js";// 引入 Turn.jsinitBook(length) {var that thi…