1 概念定義 1 概念定義 1.1 定義 確保一個類只有一個實例,而且自行實例化並向整個系統提供這個實例。 1.2 類型 創建類模式 1.3 難點 1)多個虛擬機 當系統中的單例類被拷貝運行在多個虛擬機下的時候,在每一個虛擬機下都可以創建一 個實例對象。在使用了 EJB、JINI、RMI 技術的分佈 ...
1 概念定義
1.1 定義
確保一個類只有一個實例,而且自行實例化並向整個系統提供這個實例。
1.2 類型
創建類模式
1.3 難點
1)多個虛擬機
當系統中的單例類被拷貝運行在多個虛擬機下的時候,在每一個虛擬機下都可以創建一 個實例對象。在使用了 EJB、JINI、RMI 技術的分散式系統中,由於中間件屏蔽掉了分散式 系統在物理上的差異,所以對你來說,想知道具體哪個虛擬機下運行著哪個單例對象是很困 難的。 因此,在使用以上分佈技術的系統中,應該避免使用存在狀態的單例模式,因為一個有 狀態的單例類,在不同虛擬機上,各個單例對象保存的狀態很可能是不一樣的,問題也就隨 之產生。而且在 EJB 中不要使用單例模式來控制訪問資源,因為這是由 EJB 容器來負責的。 在其它的分散式系統中,當每一個虛擬機中的資源是不同的時候,可以考慮使用單例模式來 進行管理。
2)多個類載入器
當存在多個類載入器載入類的時候,即使它們載入的是相同包名,相同類名甚至每個字 節都完全相同的類,也會被區別對待的。因為不同的類載入器會使用不同的命名空間 (namespace)來區分同一個類。因此,單例類在多載入器的環境下會產生多個單例對象。
3)錯誤的同步處理
在使用上面介紹的懶漢式單例模式時,同步處理的恰當與否也是至關重要的。不然可能 會達不到得到單個對象的效果,還可能引發死鎖等錯誤。因此在使用懶漢式單例模式時一定 要對同步有所瞭解。不過使用餓漢式單例模式就可以避免這個問題。
2 原理特征
2.1 類圖
2.2 優點
1)記憶體中只存在一個實例,節省空間
2)避免頻繁創建銷毀,減少系統性能開銷
3)可避免對資源的多重占用,如:寫時避免重覆寫
4)可在系統設置全局的訪問點,如:可用單例類來負責所有數據表的映射
2.3 缺點
1)單列模式無介面,不可拓展
2)並行開發環境中,單例模式未完成時,無法進行單元測試,也不能用mock的方式虛擬一個對象
3)單例模式與單一職責原則衝突。
3 .應用拓展
3.1 應用場景
1)要求生成唯一序列號的環境。
2)需要定義大量靜態常量和靜態方法的環境,如:工具類。
3)創建的對象消耗的資源過多時,如:訪問I/O或資料庫等資源。
4)項目中需要全局共用訪問點或共用數據時,
5)需要頻繁實例化然後銷毀的對象。
3.2 實踐拓展
1)餓漢模式
2)懶漢模式
3) 註冊模式
4 註意事項
1).只能使用單例類提供的方法得到單例對象,不要使用反射,否則將會實例化一個新對象。
2).不要做斷開單例類對象與類中靜態引用的危險操作。
3).多線程使用單例使用共用資源時,註意線程安全問題。
4).懶漢模式時註意線程同步問題,在高併發情況下會產生多個單例
5).長久未被使用的單例實例會被JVM的垃圾回收機制回收