Android中的單例模式

定義:安全

單例模式:確保某一個類只有一個實例,並且自行實例化並向整個系統提供這個實例。多線程

使用場景:函數

確保某一個類有且只有一個對象的場景,避免產生多個對象消耗過多的資源,或者某種類型的對象只應該有且只有一個。線程

UML類圖:對象

單例模式幾個關鍵點:blog

一、構造函數不對外開放,通常爲private。內存

二、經過一個靜態方法或者枚舉返回單例類對象。資源

三、確保單例類的對象有且只有一個,尤爲在多線程環境下。get

四、確保單例類對象在反序列化時不會從新構建對象。同步

單例模式簡單代碼:

public class Singleton{

static Singleton instance=null;

private void Singleton(){}

public static Singleton getInstance(){

if(instance==null){

instance=new Singleton();

}

return instance;

}

}

單例模式其餘方式:

一、懶漢模式:聲明一個靜態對象,而且在用戶第一次調用getInstance時進行初始化,在getInstance()方法中添加了synchronized關鍵字,實現該方法的同步管理,特別是在多線程狀況下,防止重複初始化。

該模式優勢:單例只有在使用時才被實例化,節省資源;缺點:第一次加載實例化,反應慢,最大問題是每次調用getInstance()方法都須要同步,形成沒必要要的同步開銷。

public class Singleton{

static Singleton instance=null;

private void Singleton(){}

public static synchronized Singleton getInstance(){

if(instance==null){

instance=new Singleton();

}

return instance;

}

}

二、Double Check Lock(DCL雙重檢查鎖定)

DCL方式實現單例模式優勢是,既可以在須要時才初始化單例,又能保證線程安全,而且單例對象初始化後調用getInstance()方法不進行同步鎖。

該實現方式最大的優勢在於getInstance()方法上,針對於instance對象進行了兩次驗證是否爲NULL;這兩種判斷主要作了三件事情:

(1)給Singleton實例對象分配內存(2)調用Singleton的構造函數,初始化成員字段(3)將instance對象指向分配的內存空間;

實例代碼以下:

public class Singleton{

static Singleton instance=null;

private void Singleton(){}

public static Singleton getInstance(){

if(instance==null){
   synchronized(Singleton.class){
     instance=new Singleton();
  }

}
return instance;

}

}

三、靜態內部類單例模式

在Singleton類中聲明一個靜態內部類,靜態類裏實現單例對象的實例化,這樣既能夠確保線程安全,也可保證單例對象惟一性,同時延遲單例的實例化,這是比較推薦的一種方式。

public class Singleton{

static Singleton instance=null;

private void Singleton(){}

public static Singleton getInstance(){

return SingletonTool.instance;

}
/****靜態內部類****/
private static class SingletonTool{
     private static final Singleton instance=new Singleton();
}

}

單例模式優勢:減小內存開支,避免資源浪費,常住內存,實現全局數據管理和共享;

單例模式缺點:擴展難,若是在Android中持有Context,容易形成內存泄漏,最好使用Application Context;

相關文章
相關標籤/搜索