單例模式屬於工廠模式的特例,只是它不需要輸入引數並且始終返回同一物件的引用。
單例模式能夠保證某一型別物件在系統中的唯一性,即某類在系統中只有乙個例項。在《設計模式:可復用物件導向軟體的基礎》一書中對單例模式的適用性有如下描述:
當類只能有乙個例項而且客戶可以從乙個眾所周知的訪問點訪問它時
當這個唯一例項應該是通過子類化可擴充套件的,並且客戶應該無需更改**就能使用乙個擴充套件的例項時。
餓漢式單例在程式啟動或單件模式類被載入的時候,單件模式例項就已經被建立,**如下:
public class single
public static singlegetinstance()
}
餓漢式的特點是首次載入時已經建立例項,如果不使用,存在浪費記憶體資源的可能性,但執行時獲取物件的速度快,並且執行緒安全。
懶漢式單例:當程式第一次訪問單例模式例項時才進行建立,**如下:
public class single
public static single getinstance()
return single;
}}
懶漢式的特點是懶漢模式的特點是載入類時比較快,但是在執行時獲取物件的速度比較慢,執行緒不安全。若要保證懶漢式執行緒安全,需要在建立例項物件時新增synchronized關鍵字,**如下:
public class single
public synchronized static single getinstance()
return single;
}}
但是在建立例項物件時新增synchronized關鍵字,加鎖和效能總是互斥的,保證了執行緒的安全,由於每次都要進入同步方法,犧牲了一定的效能
雙檢索單例是懶漢式單例基礎上了改進,保證安全性的同時,也保證了效能。spring底層建立單例物件就是基於雙檢索建立單例物件的,雙檢索單例**如下:
public class single
public static single getinstance()
}} return single;
}}
首先需注意該方法使用的是volatile關鍵字,若不採用volatile關鍵字,在某些情況下是執行緒不安全(網上說的是重排序,記憶體不可見等,暫時還未了解);其次是在建立例項方法時新增了一次檢索判斷,這樣就可以避免每次建立例項時都進入同步方法;而後在同步方法中進行第一次檢索判斷,這樣的方式便稱之為「雙檢索」
以上幾種方式的單例,都存在反射、序列化破壞單例的情況,而在jdk1.5中新增了列舉類,通過列舉類,我們可以很好的解決以上問題,有很好的避免了多執行緒同步的問題,**如下:
public enum singleton
但是,這種方式的缺點也是很明顯的,在日常的開發中,如果我們需要例項化乙個單例類是,需要記住相應的獲取方法,這無疑是給日常的開發增大了難度。
當然,以上介紹的幾種常見的單例模式,還有如靜態內部類實現單例等。以上介紹有誤的以及其他不足之處也希望大家多多指正。
設計模式 單例模式
單例模式 singleton pattern 是乙個比較簡單的模式,其定義如下 ensure a class has only one instance,and provide a golbal point of acess to it.確保某乙個類只有乙個例項,而且自行例項化並且向整個系統提供這個...
設計模式 單例模式
class testsingleton static public function instance return self testsingleton private function clone public function setsinvar sinvar public function ...
設計模式 單例模式
單例模式的目的是保證類在系統中只被例項化一次,由該唯一的例項來為系統提供服務.單例模式主要用於保證服務的統一,比如獲取統一的編號服務,模仿oracle的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...