沒有使用單例模式之前
使用單例模式後
優點
單例設計模式有八種
弊端:
如果把person換成dbaccess這個工具類,我們可以發現整個項目會建立出多個工具類執行個體,浪費空間。
實際上:
整個項目,我們隻需要一個工具類執行個體,就可以維持項目的正常運作,那麼此時讓該工具類實作單例,解決資源浪費的情況。
案例代碼
運作顯示
如下圖和案例的結果,可以得出結論:
整個項目使用到工具類,隻需要執行個體化一次就可以保障整個項目的運轉,節約了堆記憶體的空間
分類:
餓漢式(靜态常量)
餓漢式(靜态代碼塊)
懶漢式(線程不安全)
懶漢式(線程安全,同步代碼塊)
懶漢式(線程安全,同步方法)
雙重檢查
靜态内部類
枚舉
1.餓漢式(靜态常量)
2.餓漢式(靜态代碼塊)
** 3.懶漢式(線程不安全)**
4. 懶漢式(線程安全,同步代碼塊)
5.懶漢式(線程安全,同步方法)
6.雙重檢查
7.靜态内部類
8.枚舉
client類就不能直接person p = new person();
避免了寫多個執行個體的建立,保證了空間不會被浪費
結論:
單例中兩種餓漢式可用,但存在性能問題
單例中三種餓漢式不推薦,存線上程安全問題,同步方法的方式解決性能極差
最後三種單例式值得推薦(雙重檢查、靜态内部類、枚舉)
注意事項
系統記憶體中該類隻存在一個對象,節省了系統資源,對于一些需要頻繁建立銷毀的對象使用單例模式可以提升系統性能
當想執行個體化一個單例類的時候,必須要記住使用相應的擷取對象的方法,而不是使用new
應用
jdk源碼中runtime類
tomcat中applicationcontext類
session工廠
建議單例使用餓漢式,代碼更加簡潔