單例模式是一種對象建立型模式,使用單例設計模式可以保證為同一個類隻生成唯一的執行個體對象,也就是說,在整個程式空間中,隻存在一個執行個體對象。
單例模式的定義:
保證一個類,隻有一個執行個體存在,同時提供對該執行個體加以通路的全局通路方法。
單例模式的需求場景:
1,多線程之間共享同一資源或者操作同一對象。
2,使用全局變量,共享資源。
3,為了性能的考慮,需要節省對象的建立時間。
單例模式的實作:
1,俄漢式。
2,懶漢式。
3,雙重檢查。
單例模式之懶漢模式:
如果有兩個線程都要執行這段代碼,很有可能會産生兩個執行個體對象
第一、 使用synchronized來處理。也就是說将getInstance()方法變成同步方法即可。
第二,單例模式之餓漢式模式--直接初始化靜态變量。這樣就保證了線程安全:
第三、 用“雙重檢查加鎖”,在getInstance()中減少使用同步。
在這裡是首先檢查是否執行個體已經建立了,如果尚未建立,才會進行同步。這樣一來。隻有第一次會同步。
單例設計模式的優點和缺點:
優點:
1,減少對象建立,節省系統資源,提高系統性能。
缺點:
1,不利于擴充。
在android開發中使用的場景:
源碼裡面:詳見:http://www.cnblogs.com/yemeishu/archive/2013/01/04/2843705.html
說下App場景下單利常用的場景:
如下是我以前項目裡面使用ormlite資料時做的一個資料庫管理的類,通過DBManager.getInstance(context)擷取到單利的dbmanager對象,進而進一步擷取資料庫操作層的dao對象,以及全局清理資料庫裡面内容的操作:
2015年11月30日23:30:56更新
最近在讀Mr.simple的設計模式的書,書中講到了除了以上的集中方式以外的實作單利模式的幾種實作:
1,靜态内部類單利模式(比較推薦的實作模式)
Java中靜态内部類可以通路其外部類的成員屬性和方法,同時,靜态内部類隻有當被調用的時候才開始首次被加載,保證線程安全,保證單利對象的唯一性,延遲單利執行個體化。
結果為:true
2,通過枚舉的方式來實作單利
不僅能避免多線程同步問題,而且還能防止反序列化重新建立新的對象。但是失去了類的一些特性,沒有延遲加載,枚舉是線程安全的
輸出結果:
you are doubi
通過枚舉實作的相關讨論:http://segmentfault.com/q/1010000000646806
3,使用容器實作單利模式
一般是通過一個專門的類對各單例模式的此單一執行個體進行管理和維護。通過Map方式可以友善的實作此中目的
首先複習下map相關知識點:
一個映射不能包含重複的鍵,每個鍵最多隻能映射到一個值
Map的鍵唯一,是以如下className是唯一的,如果map中不存在,就執行個體化對象,并放入map集合(這個原理好騷,哈哈哈)
注意點:
傳遞給單利對象的context對象最好是Application Context。