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í)例有無,無就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;
}
}
有無問題:碰上多線程怎么辦?涼拌了。加鎖吧,或者。。。前人總結(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. 雙重檢測鎖
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;