單例模式和靜態方法之間基本的區別是非常重要的,前者給你一個Object,后者僅僅提供靜態方法,由于對像比方法具有較強的能力,可以指導你什么時候使用單例模式與靜態方法
Java中單例與靜態的區別
- 靜態類比單例具有更好的性能,因為靜態方法在編譯期綁定
- 再次,它們的區別是override的能力,因Java中的靜態方法是不可以覆蓋的,這就導致其木有太多的靈活性,另一面,你可通過繼承的方式覆蓋單例類中定義的方法
- 靜態類很難模擬,因此難于單例測試,單例更容易模擬,因為也比靜態類易于編寫單元測試,不論神馬單例期望神馬,你都可以傳遞模擬對象,例如構造方法或方法參數
- 如果你的需求中需要維護狀態信息,則單例比靜態類更適合,因為后者在維護狀態信息方面是非常可怕的,并導致狡滑的bug
- 如果是一個非常重的對象,單例可以懶加載,但是靜態類沒有這樣的優勢,并且非常熱切的加載
- 許多依賴注入的框架對單例都有良好的管理,例如Spring,使用它們非常容易