單例模式有一下特點:
1、單例類只能有一個實例。
2、單例類必須自己自己創建自己的唯一實例。
3、單例類必須給所有其他對象提供這一實例。
餓漢式單例類.在類初始化時,已經自行實例化:
public class Singleton1 {
//私有的默認構造器
private Singleton1() {}
//已經自行實例化
private static final Singleton1 single = new Singleton1();
//靜態工廠方法
public static Singleton1 getInstance() {
return single;
}
}
懶漢式單例類.在第一次調用的時候實例化:
public class Singleton2 {
//私有的默認構造器
private Singleton2() {}
//注意,這裏沒有 final
private static Singleton2 single=null;
//靜態工廠方法
public synchronized static Singleton2 getInstance() {
if (single == null) {
single = new Singleton2();
}
return single;
}
}
優點:
(1)由於單例模式在內存中只有一個實例,減少了內存開支,特別是一個對象需要頻繁地創建、銷燬時,而且創建或銷燬時性能又無法優化,單例模式的優勢就非常明顯。
(2)由於單例模式只生成一個實例,所以減少了系統的性能開銷,當一個對象的產生需要比較多的資源時,比如讀取配置、產生其他依賴對象時,則可以通過在應用啓動時直接產生一個單例對象,然後用永久駐留內存的方式來解決。
(3)單例模式可以避免對資源的多重佔用,例如一個寫文件操作,由於只有一個實例存在內存中,避免對同一個資源文件的同時寫操作。
(4)單例模式可以在系統設置全局的訪問點,優化和共享資源訪問,例如,可以設計一個單例類,負責所有數據表的映射處理。
缺點:
(1)單例模式一般沒有接口,擴展很困難,若要擴展,除了修改代碼基本上沒有第二種途徑可以實現。
(2)單例對象如果持有Context,那麼很容易引發內存泄露,此時需要注意傳給單例對象的Context最好是Application Context。