GOF23設計模式之單例模式

来源:http://www.cnblogs.com/xuzesen/archive/2016/12/23/6213854.html
-Advertisement-
Play Games

·核心作用: -保證一個類只有一個實例,並且提供一個訪問該實例的全局訪問點。 ·常見應用場景: -Windows的Task Manager(任務管理器)就是很典型的單例模式 -Windows的Recycle Bin(回收站)也是很典型的單例應用。在整個系統運行過程中,回收站一直維護著僅有的一個實例 ...


·核心作用:

  -保證一個類只有一個實例,並且提供一個訪問該實例的全局訪問點。

·常見應用場景:

  -Windows的Task Manager(任務管理器)就是很典型的單例模式

  -Windows的Recycle Bin(回收站)也是很典型的單例應用。在整個系統運行過程中,回收站一直維護著僅有的一個實例

  -項目中,讀取配置文件的類,一般也只有一個對象。沒有必要每次使用配置文件數據,每次new一個對象去讀取

  -網站的計數器,一般也是採用單例模式實現,否則難以同步

  -應用程式的日誌應用,一般都採用單例模式實現,這一般是由於共用日誌文件一直處於打開狀態,因為只能一個實例去操作,否則內容不好追加

  -資料庫連接池的設計一般也是採用單例模式,因為資料庫連接是一種資料庫資源

  -操作系統的文件系統,也是大的單例模式實現的具體例子,一個操作系統只能有一個文件系統

  -Application也是單例的典型應用(Servlet編程中會涉及到)

  -在servlet編程中,每個servlet也是單例

  -在Spring中,每個Bean預設就是單例,這樣做的優點是Spring容器可以管理

  -在SpringMVC框架中,控制對象(Controller)也是單例

·單例模式的優點:

  -由於單例模式只生成一個實例,減少了系統性能的開銷,當一個對象的產生需要比較多的資源時,如讀取配置、產生其他依賴對象時,則可以通過在應用啟動時直接產生一 個單例對象,然後永久駐留在記憶體中的方式來解決

  -單例模式可以在系統設置全局的訪問點,優化環共用資源訪問,例如可以設計一個單例類,負責所有數據表的映射處理

·常見的五種單例模式實現方式:

  -主要:

    餓漢式(線程安全,調用效率高。但是,不能延時載入)

    懶漢式(線程安全,調用效率不高。但是,可以延時載入)

  -其他:

    雙重檢測鎖式(由於JVM底層內部模型原因,偶爾會出問題,不建議使用)

    靜態內部類式(線程安全,調用效率高。可以延時載入)

    枚舉單例(線程安全,調用效率高,不能延時載入)

/**
 * 餓漢式單例模式實現
 * 問題:如果只是載入本類,而不是要調用getInstance(),甚至永遠沒有調用,則會造成資源的浪費
 * @author XuZeSen
 *
 */
public class SingletonDemo1 {
	//類初始化時,立即載入這個對象(沒有延時載入的優勢),靜態變數載入是天然的線程安全
	private static SingletonDemo1 instance = new SingletonDemo1();
	//構造器私有化
	private SingletonDemo1() {
	}
	//定義一個全局的訪問點,訪問這個單例對象,方法沒有同步,調用效率高
	public static SingletonDemo1 getInstance(){
		return instance;
	}	
}

  

 

/**
 * 懶漢式單例模式實現
 * 問題:資源利用率高了,但是,每次調用getInstance()方法都要同步,併發效率較低
 * @author XuZeSen
 *
 */
public class SingletonDemo2 {
	//類初始化時,沒有立即載入這個對象(延時載入,真正用到的時候再創建)
	private static SingletonDemo2 instance;
	//構造器私有化
	private SingletonDemo2() {
	}
	//方法同步,調用效率低
	public static synchronized SingletonDemo2 getInstance(){
		if(null == instance){
			instance = new SingletonDemo2();
		}
		return instance;
	}	
}

  

/**
 * 雙重檢測鎖實現
 * 這個模式下將內容同步到if內部,提高了執行的效率,不必每次獲取對象時都進行同步
 * 只有第一次同步創建了
 * @author Sen
 *
 */
public class SingletonDemo3 {
	private static SingletonDemo3 instance = null;
	private SingletonDemo3() {
	}
	public static SingletonDemo3 getInstance(){
		if(null == instance){
			SingletonDemo3 temp;
			synchronized (SingletonDemo3.class) {
				temp = instance;
				if(null == temp){
					synchronized (SingletonDemo3.class) {
						temp  = new SingletonDemo3();
					}
				}
				instance = temp;
			}
		}
		return instance;
	}
}

  

/**
 * 靜態內部類單例模式實現
 * 外部類沒有static屬性,則不會像餓漢式那樣立即載入對象
 * 兼備了併發高效調用和延時載入的優勢
 * @author XuZeSen
 *
 */
public class SingletonDemo4 {
	//構造器私有化
	private SingletonDemo4() {
	}
	//instance是static final類型,保證了記憶體中只有一個這樣的實例存在,而且只能被賦值一次,從而保證了線程安全性
	private static class SingletonClassInatance{
		private static final SingletonDemo4 instance = new SingletonDemo4();
	}
	//只有真正調用getInstance(),才會載入靜態內部類。載入類時是線程安全的。
	public static  SingletonDemo4 getInstance(){
		return SingletonClassInatance.instance;
	}	
}

  

 

/**
 * 枚舉式單例模式實現(沒有延時載入)
 * @author XuZeSen
 *
 */
public enum SingletonDemo5 {
	
	//這個枚舉元素,本身就是單例對象
	INSTANCE;
	
	//添加自己需要的操作!
	public void singletonOperation(){
		
	}
}

  

 

 


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

-Advertisement-
Play Games
更多相關文章
  • 樹狀數組套主席樹模板題。。。 題目大意: 給定一個含有n個數的序列a[1],a[2],a[3]……a[n],程式必須回答這樣的詢問:對於給定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的數是多少(1≤k≤j-i+1),並且,你可以改變一些a[i]的值,改變後,程式還能針對 ...
  • 一、字元串操作 創建字元串 String s2 = new String("Hello World"); String s1 = "Hello World"; 1.字元串連接 多個字元串鏈接時,每個字元串之間用+相連,+就是字元串鏈接,連接之後生成一個新的字元串。 2.獲取字元串長度 a.lengh ...
  • Swift相關知識,有時間就敲點,供自己學習總結,亦或也有幸能幫到他人,有理解、使用錯誤的地方也望能得到指正。 ///******************************************************************************************* ...
  • python內置函數open()用於打開文件和創建文件對象 語法 name:文件名 mode:指定文件的打開模式 r:只讀 w:寫入 a:附加 r+,w+,a+同時支持輸入輸出操作 rb,wb+以二進位方式打開 bufsize:定義輸出緩存 0表示無輸出緩存 1表示使用緩衝 負數表示使用系統預設設置 ...
  • 在win10環境下,安裝VS2013,Cuda,Anaconda3,並安裝Theano配置GPU詳細教程 ...
  • 本人看的深入理解jvm(該版本的java se7) java運行時數據區域 Java虛擬機在執行java程式時,把記憶體劃分為幾個不同的階段,存在不同的存在時間。不同的用途 先上圖 程式計數器:是jvm中一小塊記憶體空間,可以當做當前線程的位元組碼文件的行號,位元組碼解釋器通過改變這個值來獲取下一個指令。J ...
  • 這是俺滴師傅給俺傳授了的知識,特在此分享。 TP框架,做PHP開發的都應該有所耳聞。下麵,我們就來說說入口文件的生成: 創建新項目時,首先,在目錄文件下創建一個新的文件夾。然後將Thinkphp框架文件包拷進去。 (框架包) 框架包裡面的文件主要用到的是上面三個圈起來的,只用拷這幾個就行。 (這時, ...
  • StringBuffer 線程安全的可變字元序列。 StringBuffer源碼分析(JDK1.6): public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, Cha ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...