三種單例模式的實現和理解 (2016-7-2)
tags: 單例模式,餓漢式,懶漢式,內部類方式
先說一下單例的定義,用的非常多,但不一定描述的出來:保證一個類只有一個實例,並提供一個訪問它的全局訪問點。
單例模式在Android開發中用的非常多,以前全部一股腦的使用餓漢式來實現,但是這種不管有沒有實例化對象都一定有一個實例存在於內存中。
==餓漢式:==
特點:能保證全局只有一個實例,線程安全。一定有一個實例存在於內存中。
代碼實現:
public class SingleTon {
//私有構造函數
private SingleTon(){}
//定義時就new
private static SingleTon Instance = new SingleTon();
public static SingleTon getInstance(){
return Instance;
}
}
加載到類的時候即使沒有調用getInstance()方法,new SingleTon()也已經執行過了。
==靜態內部類方式實現:==
特點:線程安全,效率也比懶漢式高,調用時纔會創建實例。
代碼實現:
public class SingleTon {
//私有構造函數
private SingleTon(){}
//定義時就new
private static class SingleTonInner{
private static final SingleTon Instance = new SingleTon();
}
//不加final關鍵字的話則需要判空
public static final SingleTon getInstance(){
return SingleTonInner.Instance;
}
}
加載到類的時候即使沒有調用getInstance()方法,new SingleTon()不會執。
==懶漢式:==
特點:能保證全局只有一個實例,線程不安全,用synchronize關鍵字修飾getInstance()方法後可以保證線程同步,但是會造成效率低。
代碼實現:
public class SingleTon {
//私有構造函數
private SingleTon(){}
//定義時不new
private static SingleTon Instance ;
public synchronized static SingleTon getInstance(){
if(Instance==null){
return Instance = new SingleTon();
}else
return Instance;
}
}
加載到類的時候即使沒有調用getInstance()方法,new SingleTon()就不會執行,所以不像餓漢式未調用也有一個實例存在於內存中。
##### 總結:一般用靜態內部類方式實現,其他的比較好的還有enum方式實現(這種比較好,jdk1.5以後可用)。