一. 定義:java
單例模式:確保一個類只有一個實例,並且自行實例化並向整個系統提供這個實例。數據庫
初始化時實例化併發
構造函數設置爲私有訪問權限,禁止外部建立對象ide
其餘類對該類的訪問均可以經過getInstance得到同一個對象函數
public class Singleton { private static Singleton singleton = null; /** * 限制產生多個對象 */ private Singleton() { } /** * 經過該方法得到實例對象 * @return */ public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { singleton = new Singleton(); } } return singleton; } /** * 類中其餘方法,儘可能是static */ public static void dosomething() { } }
二. 單例模式優缺點:
高併發
單例模式的優勢:工具
-- 因爲單例模式在內存中只有一個實例,減小了開支,特別是一個對象須要頻繁地建立銷燬時性能又沒法優化時;性能
-- 減小性能開銷。當一個對象的產生須要比較多的資源時,如讀取配置、產生其餘依賴對象時,可經過在應用啓動時直接產生一個單例對象,而後永久駐留在內存的方式來解決;測試
-- 單例對象能夠避免對資源的多重佔用。(避免對同一個資源文件的同時寫操做);優化
-- 能夠在系統設置全局訪問點,優化和共享資源訪問。
缺點:
-- 單例模式通常沒有接口,擴展很困難;
-- 單例模式對測試是不利的。在並行開發環境中,若是單例模式沒有完成,是不能進行測試的,沒有接口也不能使用mock的方式虛擬一個對象;
-- 單例模式與單一職責原則有衝突。一個類應該只是實現一個邏輯,而不關心它是不是單例的。
三. 狀態模式的使用場景及注意事項
1.使用場景:
要求生成惟一序列號的環境;
在整個項目中須要一個共享訪問點或共享數據;
建立一個對象須要消耗的資源過多,如要訪問IO和數據庫等資源;
須要定義大量的靜態常量和靜態方法(如工具類)的環境。
Spring中的bean默認就是單例。這樣作Spring容器能夠管理這些Bean的生命週期,決定這些bean的建立、銷燬等。
2.注意事項:
高併發狀況下,注意單例模式的線程同步問題。