歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android中的單例模式

Android中的單例模式

日期:2017/3/1 9:18:27   编辑:Linux編程

定義:

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

使用場景:

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

UML類圖:

單例模式幾個關鍵點:

1、構造函數不對外開放,一般為private。

2、通過一個靜態方法或者枚舉返回單例類對象。

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

4、確保單例類對象在反序列化時不會重新構建對象。

單例模式簡單代碼:

public class Singleton{

static Singleton instance=null;

private void Singleton(){}

public static Singleton getInstance(){

if(instance==null){

instance=new Singleton();

}

return instance;

}

}

單例模式其他方式:

1、懶漢模式:聲明一個靜態對象,並且在用戶第一次調用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;

}

}

2、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;

}

}

3、靜態內部類單例模式

在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;

更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11

Copyright © Linux教程網 All Rights Reserved