單例的三種實現及理解

三種單例模式的實現和理解 (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以後可用)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章