Java中單例模式和靜態類的區別

轉:http://www.2cto.com/kf/201311/260911.html   
    確實存在一些場景,靜態類比單例更適合,這個場景中主要的一個例子就是java.lang.Math。如果你的單例不需要維護任何狀態,僅僅提供全局訪問的方法,這種情況考慮使用靜態類,靜態方法比單例更快,因爲靜態的綁定是在編譯期就進行的。但是要記住,不建議在靜態類中維護狀態信息,特別是在併發環境中,若無適當的同步措施而修改多線程併發時,會導致壞的競態條件。如果你需要將一些工具方法集中在一起時,你可以選擇使用靜態方法,但是別的東西,要求單例訪問資源時,應該使用單例模式。
1) 靜態類比單例具有更好的性能,因爲靜態方法在編譯期綁定。
2) 再次,它們的區別是override的能力,因Java中的靜態方法是不可以覆蓋的,這就導致其木有太多的靈活性,另一面,你可通過繼承的方式覆蓋單例   類中定義的方法(提供內包類)。
3) 靜態類很難模擬,因此難於單例測試,單例更容易模擬,因爲也比靜態類易於編寫單元測試,不論什麼單例期望什麼,你都可以傳遞模擬對象,例如構造方法或方法參數。
4)如果你的需求中需要維護狀態信息,則單例比靜態類更適合,因爲後者在維護狀態信息方面是非常可怕的,並導致狡滑的bug。
5)如果是一個非常重的對象,單例可以懶加載,但是靜態類沒有這樣的優勢,並且非常熱切的加載。
6) 許多依賴注入的框架對單例都有良好的管理,例如Spring,使用它們非常容易。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章