Java 設計模式(三)-單例模式(Singleton Pattern)

来源:http://www.cnblogs.com/Devonmusa/archive/2017/04/09/6683626.html
-Advertisement-
Play Games

1 概念定義 1 概念定義 1.1 定義 確保一個類只有一個實例,而且自行實例化並向整個系統提供這個實例。 1.2 類型 創建類模式 1.3 難點 1)多個虛擬機 當系統中的單例類被拷貝運行在多個虛擬機下的時候,在每一個虛擬機下都可以創建一 個實例對象。在使用了 EJB、JINI、RMI 技術的分佈 ...


 

1     概念定義

1.1   定義

確保一個類只有一個實例,而且自行實例化並向整個系統提供這個實例。

1.2   類型

創建類模式

1.3   難點

1)多個虛擬機

當系統中的單例類被拷貝運行在多個虛擬機下的時候,在每一個虛擬機下都可以創建一 個實例對象。在使用了 EJBJINIRMI 技術的分散式系統中,由於中間件屏蔽掉了分散式 系統在物理上的差異,所以對你來說,想知道具體哪個虛擬機下運行著哪個單例對象是很困 難的。 因此,在使用以上分佈技術的系統中,應該避免使用存在狀態的單例模式,因為一個有 狀態的單例類,在不同虛擬機上,各個單例對象保存的狀態很可能是不一樣的,問題也就隨 之產生。而且在 EJB 中不要使用單例模式來控制訪問資源,因為這是由 EJB 容器來負責的。 在其它的分散式系統中,當每一個虛擬機中的資源是不同的時候,可以考慮使用單例模式來 進行管理。

2)多個類載入器

當存在多個類載入器載入類的時候,即使它們載入的是相同包名,相同類名甚至每個字 節都完全相同的類,也會被區別對待的。因為不同的類載入器會使用不同的命名空間 namespace)來區分同一個類。因此,單例類在多載入器的環境下會產生多個單例對象。

3)錯誤的同步處理

在使用上面介紹的懶漢式單例模式時,同步處理的恰當與否也是至關重要的。不然可能 會達不到得到單個對象的效果,還可能引發死鎖等錯誤。因此在使用懶漢式單例模式時一定 要對同步有所瞭解。不過使用餓漢式單例模式就可以避免這個問題。

2     原理特征

2.1   類圖

 

2.2   優點

1)記憶體中只存在一個實例,節省空間

2)避免頻繁創建銷毀,減少系統性能開銷

3)可避免對資源的多重占用,如:寫時避免重覆寫

4)可在系統設置全局的訪問點,如:可用單例類來負責所有數據表的映射

2.3   缺點

1)單列模式無介面,不可拓展

2)並行開發環境中,單例模式未完成時,無法進行單元測試,也不能用mock的方式虛擬一個對象

3)單例模式與單一職責原則衝突。

3     .應用拓展

3.1   應用場景

1)要求生成唯一序列號的環境。

2)需要定義大量靜態常量和靜態方法的環境,如:工具類。

3)創建的對象消耗的資源過多時,如:訪問I/O或資料庫等資源。

4)項目中需要全局共用訪問點或共用數據時,

5)需要頻繁實例化然後銷毀的對象。

3.2   實踐拓展

1)餓漢模式

https://github.com/Devonmusa/java-demos/blob/master/src/main/java/com/designpattern/singleton/HungrySingleton.java

2)懶漢模式

https://github.com/Devonmusa/java-demos/blob/master/src/main/java/com/designpattern/singleton/LazySingleton.java

3)  註冊模式

https://github.com/Devonmusa/java-demos/blob/master/src/main/java/com/designpattern/singleton/RegisterSingleton.java

4     註意事項

1).只能使用單例類提供的方法得到單例對象,不要使用反射,否則將會實例化一個新對象。

2).不要做斷開單例類對象與類中靜態引用的危險操作。

3).多線程使用單例使用共用資源時,註意線程安全問題。

4).懶漢模式時註意線程同步問題,在高併發情況下會產生多個單例

5).長久未被使用的單例實例會被JVM的垃圾回收機制回收

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • A 調用攝像頭拍照,自定義裁剪編輯頭像,頭像圖片色度調節B 集成代碼生成器 [正反雙向](單表、主表、明細表、樹形表,快速開發利器)+快速表單構建器 freemaker模版技術 ,0個代碼不用寫,生成完整的一個模塊,帶頁面、建表sql腳本,處理類,service等完整模塊C 集成阿裡巴巴資料庫連接池 ...
  • 動態代理是大型框架中經常用到的經典的技術之一,博主在理解spring的控制反轉(依賴註入)的思想時回頭著重覆習了一下java的動態代理。在說動態代理之前我們先簡單說一說代理是用來乾什麼的,用於什麼樣的業務場景然後在引入靜態代理和動態代理。 ...
  • 文件:文件是信息在電腦上的保存形式。 可控式異常:一種必須被處理或必須在可能產生異常的方法中給出聲明的異常。 可控式異常的三種處理方式: 1)try...catch捕獲 2)throws語句往上拋 3)以上兩種方法結合處理 throws 語句:聲明某個方法將不會處理某些異常的語句。 基於標記的文件 ...
  • 1.Vue簡介 Vue是一套構建用戶界面的漸進性框架。Vue採用自底向上增量開發的設計,其關註點在圖層,與angular的區別就在這裡,它關註的是圖層,而angular註釋的是數據。 2.與React的區別: 2.1相同點 使用Virtual DOM(虛擬dom) 提供響應式(Reactive) 和 ...
  • 1.僅需引入spring相關的包。 2.在xml裡加入task的命名空間 3.配置定時任務的線程池 4.寫定時任務 總結: 1.配置定時任務線程池可以同時執行同一時間的任務,否則是按照順序執行。 2.如果xml裡面開啟的懶載入,default-lazy-init="true",需要有@Lazy(fa ...
  • 項目下載地址:http://download.csdn.NET/detail/aqsunkai/9805821 定義一個攔截器,判斷用戶是通過記住我登錄時,查詢資料庫後臺自動登錄,同時把用戶放入session中。 配置攔截器也很簡單,Spring 為此提供了基礎類WebMvcConfigurerAd ...
  • 設計模式是面向對象編程的基礎,是用於指導程式設計。在實際項目開發過程中,並不是一味將設計模式進行套用,也不是功能設計時大量引入設計模式。應該根據具體需求和要求應用適合的設計模式。設計模式是一個老話題了,因為最近在設計“網關API”組件(後續介紹),採用“責任鏈設計模式”進行設計,所以先進行回顧記錄。 ...
  • 購物車主要作用在於:1、和傳統賣場類似,方便用戶一次選擇多件商品去結算。2、充當臨時收藏夾的功能。3、對於商家來說,購物車是向用戶推銷的最佳場所之一。 早期 ERP拆分 業務服務化拆分 WCS拆分 購物車功能模塊概況 層級設計 群集設計 雲購物車從應用層 面上設計了三個—— 交互層、業務... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...