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