Singleton (單例模式)
Intent :Ensure a class only has one instance , and provide a global point of access of it.
瞎談:就是保證一個類只有一個實例,,并且提供一個全局可訪問的點,。打個比方,,廣州限制每戶人家養(yǎng)狗,,但是只能養(yǎng)一條,。一開始你沒有狗,你去買一條,。若干年后,,狗不行失蹤了。你為了填補寂寞的空虛,,別人又送你一條(或者還是你自己買的),。我們不關(guān)注你的狗來源,只保證你家的狗每時每刻就一條,。你為了確保以后養(yǎng)狗方便,,就到保險公司辦了保險,他們承諾,,你的狗要是出現(xiàn)意外事故,,他們負(fù)責(zé)陪一條給你。從此,,你自由了,,狗的事情交給別人了,而且別人也保證只給一條給你,。
正經(jīng):很多時候我們要保證類的實例只有一個,。我們可能在自己的代碼中判斷需要的類的實例有無,無就new一個,。這樣看似不錯,。問題是,你用到這個類的地方有n個,,這樣你就需要n個判斷,。為什么不把這個職責(zé)交給類本身呢,?然后讓類提供一個接口訪問
代碼實現(xiàn):
public class Singleton { private static Singleton singleton=null; private Singleton() {} public static Singleton instance() { if(singleton==null) singleton = new Singleton(); return singleton return singleton; } }
有無問題:碰上多線程怎么辦?涼拌了,。加鎖吧,或者,。。,。前人總結(jié)的經(jīng)驗,,有3中方法 1. 直接加鎖 public class Singleton { private static Singleton singleton=null; private Singleton() {} public static synchronized Singleton instance() { if(singleton==null) singleton = new Singleton(); return singleton return singleton; } } 2. 早期實例化 public class Singleton { private static Singleton singleton = new Singleton(); private Singleton(); public static Singleton getInstance() { return singleton; } }
3. 雙重檢測鎖 public class Singleton { private volatile static Singleton singleton=null; private Singleton(){} public static Singleton getInstance() { if(singleton==null) { synchronized(Singleton.class) { singleton=new Singleton(); } } return singleton; }
補充一種形式,也是線程安全的:The solution of Bill Pugh
|
|