獨一無二的設計模式——單例模式(Java實現)

1. 引言

親愛的讀者們,歡迎來到我們的設計模式專題,今天的講解的設計模式,還是單例模式哦!上次講解的單例模式是基于Python實現(獨一無二的設計模式——單例模式(python實現))的,但是目前很多實際系統是通過JAVA實現的,所以今天聊一聊基于JAVA的語言特性,單例模式的實現和應用。

2. 什么是單例模式

單例模式(Singleton Pattern)是一種創建型設計模式,它確保一個類只有一個實例,并提供一個全局訪問點。就像世界上只有一個太陽,我們也希望某些對象在整個應用程序中只有一個實例。單例模式適用于需要全局唯一訪問的資源,如數據庫連接、配置管理器、日志記錄器等。

3. 單例模式的實現(Java)

基本實現

在Java中,單例模式通常使用懶漢式或餓漢式實現,以下講解四種主要的實現方法:

懶漢式實現,懶漢式單例模式只有在第一次調用getInstance方法時才會創建實例:
public class Singleton {private static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}
詳細代碼解析
  • instance靜態變量用于存儲單例實例,在類加載時,它被初始化為null
  • getInstance方法是獲取實例的關鍵,如果instance為空,則創建一個新的實例并返回,否則返回已有的實例;
  • 私有構造函數Singleton()防止類被外部實例化,確保實例只能通過getInstance方法獲取。
多線程安全的懶漢式實現,為了應對多線程環境,可以使用同步塊來確保線程安全:
public class Singleton {private static Singleton instance;private static final Object lock = new Object();private Singleton() {}public static Singleton getInstance() {if (instance == null) {synchronized (lock) {if (instance == null) {instance = new Singleton();}}}return instance;}
}
詳細代碼解析
  • lock是一個同步對象,用于確保在多線程環境下,只有一個線程能夠創建實例;
  • getInstance方法中使用synchronized塊來加鎖,確保只有一個線程能夠進入創建實例的代碼塊。
餓漢式實現,餓漢式單例在類加載時就創建實例,相比懶漢式避免了多線程問題:
public class Singleton {private static final Singleton instance = new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;}
}
詳細代碼解析
  • instance靜態變量在類加載時即被初始化,確保實例的唯一性和線程安全;
  • 私有構造函數防止外部實例化。
靜態內部類實現,這種方法利用類加載機制,只有在調用getInstance時才會創建實例,確保線程安全和延遲加載:
public class Singleton {private Singleton() {}private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance() {return SingletonHolder.INSTANCE;}
}
詳細代碼解析
  • SingletonHolder是一個靜態內部類,包含了Singleton的唯一實例;
  • getInstance方法中返回SingletonHolder.INSTANCE,確保實例的延遲加載和線程安全。

4. 單例模式的應用場景和實例

示例一:配置文件管理

在應用程序中,配置文件通常需要全局訪問且不應被重復加載。使用單例模式可以確保配置管理器只有一個實例,從而避免重復加載配置文件。

import java.util.Properties;public class ConfigurationManager {private static ConfigurationManager instance;private Properties config;private ConfigurationManager() {config = new Properties();}public static ConfigurationManager getInstance() {if (instance == null) {instance = new ConfigurationManager();}return instance;}public void setConfig(String key, String value) {config.setProperty(key, value);}public String getConfig(String key) {return config.getProperty(key);}
}

使用示例:

ConfigurationManager configManager = ConfigurationManager.getInstance();
configManager.setConfig("api_url", "https://api.example.com");
System.out.println(configManager.getConfig("api_url"));
示例二:日志記錄

日志記錄器是單例模式的經典應用之一,通過確保日志記錄器的唯一性,我們可以統一管理日志輸出,避免多個日志實例之間的混亂:

import java.util.logging.*;public class LoggerSingleton {private static LoggerSingleton instance;private Logger logger;private LoggerSingleton() {logger = Logger.getLogger("singleton_logger");ConsoleHandler handler = new ConsoleHandler();SimpleFormatter formatter = new SimpleFormatter();handler.setFormatter(formatter);logger.addHandler(handler);logger.setLevel(Level.INFO);}public static LoggerSingleton getInstance() {if (instance == null) {instance = new LoggerSingleton();}return instance;}public void log(String message) {logger.info(message);}
}

使用示例:

LoggerSingleton logger = LoggerSingleton.getInstance();
logger.log("This is a log message.");

5. 單例模式的優缺點

優點
  • 控制實例數量:確保一個類只有一個實例,節省資源;
  • 全局訪問點:提供一個全局訪問點,方便管理和使用。
缺點
  • 不易擴展:由于單例模式限制了實例的數量,可能不利于擴展;
  • 隱藏依賴關系:單例模式通過全局訪問點使用實例,可能導致代碼依賴關系不明確,不利于測試。

6. 圖示

  • 單例模式的UML圖:
+----------------+
|   Singleton    |
+----------------+
| - _instance    |
| - _lock        |
+----------------+
| + getInstance()|
+----------------+
  • 單例模式的示意圖:

7. 總結

單例模式是一種簡單而強大的設計模式,確保一個類只有一個實例,并提供全局訪問點。在實際開發中,單例模式廣泛應用于配置管理、日志記錄等場景,通過合理地使用單例模式,我們可以有效管理和優化資源,確保系統的一致性和穩定性。

希望今天的分享能讓大家對單例模式有更深入的理解,如果你在項目中也使用了單例模式,歡迎留言分享你的經驗和見解!
在這里插入圖片描述

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

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

相關文章

web全屏api,實現元素放大全屏,requestFullscreen,exitFullscreen

全屏api 主要方法 document.exitFullscreen(); 退出頁面全屏狀態,document是全局文檔對象 dom.requestFullscreen(); 使dom進入全屏狀態,異步,dom是一個dom元素 dom.onfullscreenchange(); 全…

專題四:Spring源碼初始化環境與BeanFactory

上文我們通過new ClassPathXmlApplicationContext("applicationContext.xml");這段代碼看了下Spring是如何將Xml里面內容注入到Java對象中,并通過context.getBean("jmUser");方式獲得了一個對象實例,而避開使用new 來耦合。今天我們…

【TB作品】智能臺燈控制器,ATMEGA128單片機,Proteus仿真

題目 8 :智能臺燈控制器 基于單片機設計智能臺燈控制器,要求可以調節 LED 燈的亮度,實現定時開啟與關閉, 根據光照自動開啟與關閉功能。 具體要求如下: (1)通過 PWM 功能調節 LED 燈亮度&#x…

【本地調試】使用 Nginx 和 Hosts 文件實現本地開發調試請求轉發

可以按照以下 nginx 配置來設置,通過 nginx 和 host 將網頁的請求轉發到本地的后端服務器,以方便本地開發調試 一、nginx 配置 worker_processes 1;events {worker_connections 1024; }http {include mime.types;default_type application/js…

【Python】 數據分析中的常見統計量:中位數

那年夏天我和你躲在 這一大片寧靜的海 直到后來我們都還在 對這個世界充滿期待 今年冬天你已經不在 我的心空出了一塊 很高興遇見你 讓我終究明白 回憶比真實精彩 🎵 王心凌《那年夏天寧靜的海》 中位數(Median)是統計學…

深入淺出3D感知中的優化與基于學習的技術1(原創系列)

近期幾乎看了所有有關NERF技術論文,本身我研究的領域不在深度學習技術方向,是傳統的機器人控制和感知。所以總結了下這部分基于學習的感知技術,會寫一個新的系列教程講解這部分三維感知技術的發展到最新的技術細節,并支持自己最近…

娛樂圈發生震動,AI大模型技術已經取代了SNH48的小偶像?

自2023年以來,全球都被包裹在AI的驚天大潮之中,所有行業都在主動或被動地迎接改變。目前,各行業已經有大量公司正在把AI作為自身發展的最佳路徑。其中,娛樂行業作為最被人們熟知的行業也在面對AI的發展時,發生著巨大變…

解析Java中1000個常用類:Currency類,你學會了嗎?

在線工具站 推薦一個程序員在線工具站:程序員常用工具(http://cxytools.com),有時間戳、JSON格式化、文本對比、HASH生成、UUID生成等常用工具,效率加倍嘎嘎好用。程序員資料站 推薦一個程序員編程資料站:程序員的成長之路(http://cxyroad.com),收錄了一些列的技術教程…

解析connectionReset異常的原因與解決方案

解析connectionReset異常的原因與解決方案 大家好,我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿!今天我們將深入探討Java中connectionReset異常的原因及其解決方案。這…

遙遠星辰中的覺醒:超大質量黑洞的蘇醒與人類的未來

遙遠星辰中的覺醒:超大質量黑洞的蘇醒與人類的未來 在浩渺無垠的宇宙中,星辰的閃爍仿佛是時間的漣漪,穿越億萬年的距離,抵達我們的眼眸。而在這片星辰大海的深處,一個驚人的現象正在悄然上演——距離地球3.6億光年之遙…

Unity獲取剪切板內容粘貼板圖片文件文字

最近做了一個發送消息的unity項目,需要訪問剪切板里面的圖片文字文件等,翻遍了網上的東西,看了不是需要導入System.Windows.Forms(關鍵導入了unity還不好用,只能用在純c#項目中),所以我看了下py…

GMSB文章九:微生物的相關關系組間波動

歡迎大家關注全網生信學習者系列: WX公zhong號:生信學習者Xiao hong書:生信學習者知hu:生信學習者CDSN:生信學習者2 介紹 計算配對微生物在組間的相關關系波動情況進而評估不同分組的微生物狀態。secom_linear 函數…

線性表與順序存儲結構(下)

前言 接上文(線性表與順序存儲結構(上))。 這些順序存儲結構的方法在順序表上下卷中已經提到過,但是有些許不同,可以為理解順序表提供更豐富的視角。(不過最主要的區別在于順序表上下卷中的順…

機器人關節 viscous friction與結構阻尼

Viscous Friction(粘性摩擦) 定義:Viscous friction,也被稱為粘性摩擦或粘滯摩擦,是機器人關節在運動過程中由于接觸面之間的相互作用而產生的摩擦力。這種摩擦力與關節的運動速度有關,通常表現為速度越大&…

HarmonyOS開發實戰:分布式文件系統-hmdfs

分布式文件系統提供跨設備的文件訪問能力,適用于如下場景: 兩臺設備組網,A 設備可以無感讀取和修改 B 設備的文件。 邊緣服務器可以自動同步組網中多個嵌入式設備中的文件數據。 hmdfs 在分布式軟總線動態組網的基礎上,為網絡上…

Ubuntu添加系統字體

(2024.6.30) 系統字體保存路徑在/usr/share/fonts下,如果此目錄下缺少字體,則使用其他可視化api(如Python的pygame庫)的默認配置時可能會出現亂碼問題。 往Ubuntu中添加字體的方法 方法一:手…

Ant Design Vue:如何提升你的前端開發效率?

目錄 1. Ant Design Vue 簡介 1.1 特性概覽 1.2 安裝與配置 2. 常用組件及使用示例 2.1 Button 按鈕 2.2 Form 表單 2.3 Table 表格 2.4 Modal 對話框 3. 常見問題及解決方案 3.1 組件無法渲染 問題描述 解決方案 3.2 表單驗證失效 問題描述 解決方案 3.3 表格…

Python | 計算位渦平流項

寫在前面 最近忙著復習、考試…都沒怎么空敲代碼,還得再準備一周考試。。。等考完試再慢慢更新了,今天先來淺更一個簡單但是使用的python code 在做動力機制分析時,我們常常需要借助收支方程來診斷不同過程的貢獻,其中最常見的一…

51單片機-點亮LED燈

目錄 新建項目選擇型號添加新文件到該項目設置字體和utf-8編碼二極管如何區分正負極原理:CPU通過寄存器來控制硬件電路 用P2寄存器的值控制第一個燈亮進制轉換編譯查看P2寄存器的地址生成HEX文件把代碼下載到單片機中 新建項目 選擇型號 stc是中國生產的、這個里面…

token登錄比密碼登錄有什么優勢嗎

token登錄比密碼登錄有什么優勢嗎 使用令牌(Token)登錄相比于密碼登錄具有一些優勢,包括: 安全性:令牌通常采用加密技術,使得它們更難以被盜取或猜測。相比之下,密碼存在被猜測、破解或被暴力攻…