單例模式(Singleton Pattern)
其定義爲:Ensure a class has only one instance , and provide a global point of access to it.
單例模式的通用類圖爲:
單例模式的優點:
1、由於單例模式在內存中一個實例,減少了內存開支,特別是對一個對象需要頻繁的創建、銷燬時,而且創建或者銷燬時性能又無法優化,單例模式很適用。
2、由於單例模式只生成一個實例,所以減少了系統開銷,當一個對象產生需要比較多的資源時,如讀取配置,產生其他的依賴對象時,則可以在啓動的時候創建一個單例對象來解決。
3、單例模式可以避免對資源的多重佔用,因只有一個實例在內存中。
4、單例模式可以在系統中設置全局的訪問點,優化和共享資源訪問。
單例模式的缺點:
1、單例模式一般沒有接口,擴展很困難。
2、單例模式對測試時不利的,在並行開發環境中,如果單例模式還沒有完成,是不能進行測試的。
3、單例模式與單一職責原則有衝突。
單例模式的注意事項:
在高併發情況下,需要注意單例模式的線程同步問題。如下:
public class Singleton{
private static Singleton singleton = null;
private Singleton(){}
public static Singleton getSingleton(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
該段代碼會出現多個實例:如一個線程A執行到singleton = new Singleton();單還沒有獲取對象,第二個線程B也執行到singleton == null,那麼線程B也將進入if語句中獲得一個實例,,這樣在內存中就出現了兩個實例。解決這個線程不安全的方法可以在方法前加上關鍵字synchronized,或者在方法中增加synchronized。