觀點一:(單例)
單例模式比靜態方法有不少優點:
首先,單例能夠繼承類,實現接口,而靜態類不能(能夠集成類,但不能集成實例成員);
其次,單例能夠被延遲初始化,靜態類通常在第一次加載是初始化;
再次,單例類能夠被集成,他的方法能夠被覆寫;
最後,或許最重要的是,單例類能夠被用於多態而無需強迫用戶只假定惟一的實例。舉個例子,你可能在開始時只寫一個配置,可是之後你可能須要支持超過一個配置集,或者可能須要容許用戶從外部從外部文件中加載一個配置對象,或者編寫本身的。你的代碼不須要關注全局的狀態,所以你的代碼會更加靈活。
觀點二:(靜態方法)靜態方法中產生的對象,會隨着靜態方法執行完畢而釋放掉,並且執行類中的靜態方法時,不會實例化靜態方法所在的類。若是是用singleton, 產生的那一個惟一的實例,會一直在內存中,不會被GC清除的(緣由是靜態的屬性變量不會被GC清除),除非整個JVM退出了。這個問題我以前也想幾天,而且本身寫代碼來作了個實驗。
觀點三:(Good!)html
因爲DAO的初始化,會比較佔系統資源的,若是用靜態方法來取,會不斷地初始化和釋放,因此我我的認爲若是不存在比較複雜的事務管理,用singleton會比較好。我的意見,歡迎各位高手指正。 web
http://blog.csdn.net/v1v1wang/article/details/5511756數據庫
-----------------------------------------------------------------------------------------------------------瀏覽器
這裏暫且把單例模式限定爲不是全用靜態函數實現的。安全
1。使用的方便性:若是須要初始化工做,單例模式能夠在構造函數裏面完成,全靜態函數的類須要一個額外的函數來完成初始化工做,並且使用者若是沒有調用這個initialize函數,那麼後續的操做就會有問題,構造函數會被默認調用,因此使用起來比較簡單,對使用者作出了最少的假設。服務器
2。初始化時機:單例模式初始化比較靈活,能夠在須要的時候初始化,而全靜態函數必然致使成員全爲靜態成員,靜態成員是在編譯時就初始化好了。若是初始化成本比較昂貴,而且程序裏面未必必定使用這個類,那這將是單例模式的一個很大優點。順便說一下全局變量,全局變量的初始化順序是未指定的。函數
例如 全局變量int a; int b;編譯器是先初始化a仍是先初始化b?我想你們只能靠猜,或者在某個編譯器上實驗一下給出答案,一旦要是有個新編譯器,結果又會是什麼樣子呢?post
3。最重要的區別:單例模式能夠有多態,而全靜態的類不能支持多態。學習
http://www.cnblogs.com/phoebus0501/archive/2011/03/12/1982408.html優化
數據庫操做類不宜使用singleton模式
不要將數據庫鏈接作成單例,由於一個系統可能會與數據庫有多個鏈接,而且在有鏈接池的狀況下,應當儘量及時釋放鏈接。Singleton模式因爲使用靜態成員存儲類實例,因此可能會形成資源沒法及時釋放,帶來問題。