定義: 單例模式:確保某一個類只有一個實例,而且自行實例化並向整個系統提供這個實例。 使用場景: 確保某一個類有且只有一個對象的場景,避免產生多個對象消耗過多的資源,或者某種類型的對象只應該有且只有一個。 UML類圖: 單例模式幾個關鍵點: 1、構造函數不對外開放,一般為private。 2、通過一
定義:
單例模式:確保某一個類只有一個實例,而且自行實例化並向整個系統提供這個實例。
使用場景:
確保某一個類有且只有一個對象的場景,避免產生多個對象消耗過多的資源,或者某種類型的對象只應該有且只有一個。
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;