一. 定義:
單例模式:確定一個類隻有一個執行個體,而且自行執行個體化并向整個系統提供這個執行個體。
初始化時執行個體化
構造函數設定為私有通路權限,禁止外部建立對象
其他類對該類的通路都可以通過getinstance獲得同一個對象
二. 單例模式優缺點:
單例模式的優點:
-- 由于單例模式在記憶體中隻有一個執行個體,減少了開支,特别是一個對象需要頻繁地建立銷毀時性能又無法優化時;
-- 減少性能開銷。當一個對象的産生需要比較多的資源時,如讀取配置、産生其他依賴對象時,可通過在應用啟動時直接産生一個單例對象,然後永久駐留在記憶體的方式來解決;
-- 單例對象可以避免對資源的多重占用。(避免對同一個資源檔案的同時寫操作);
-- 可以在系統設定全局通路點,優化和共享資源通路。
缺點:
-- 單例模式一般沒有接口,擴充很困難;
-- 單例模式對測試是不利的。在并行開發環境中,如果單例模式沒有完成,是不能進行測試的,沒有接口也不能使用mock的方式虛拟一個對象;
-- 單例模式與單一職責原則有沖突。一個類應該隻是實作一個邏輯,而不關心它是否是單例的。
三. 狀态模式的使用場景及注意事項
1.使用場景:
要求生成唯一序列号的環境;
在整個項目中需要一個共享通路點或共享資料;
建立一個對象需要消耗的資源過多,如要通路io和資料庫等資源;
需要定義大量的靜态常量和靜态方法(如工具類)的環境。
spring中的bean預設就是單例。這樣做spring容器可以管理這些bean的生命周期,決定這些bean的建立、銷毀等。
2.注意事項:
高并發情況下,注意單例模式的線程同步問題。