回答
一個類實例化多少次不應該由類本身決定,而應該由提供單實例的基礎結構決定。 Singleton使得這個決定不可能離開基礎設施。這是一個可重用性問題,例如在單元測試中出現,而且當基礎架構試圖爲特定目的提供另一個實例時。
(如只有一個數據庫連接。但是從另一個數據庫導入數據,它需要另一個連接。如果數據庫接入服務將是一個單身,這是不可能打開另一個連接。)
單元模式讓單元測試更加困難,因爲它將全局狀態引入到應用程序中。
還應該注意的是,這種模式降低了程序內並行的可能性,因爲在多線程上下文中對單例的訪問必須被序列化,例如通過鎖定。
依賴注入的倡導者會認爲這是一種反模式,主要是由於它使用私有和靜態方法。
一些人提出了使用諸如Java或PHP等語言反射的方法來分解單例模式的方法。
的簡單的答案是他們引入了一個全局狀態的對象到你的代碼中,這打破了你對問題的分離(可能增加了複雜性)。
單身也不是沒有其他的缺點,你應該知道:
http://en.wikipedia.org/wiki/Singleton_pattern#Drawbacks
這篇文章是有點更詳細:
http://code.google.com/p/google-singleton-detector/wiki/WhySingletonsAreControversial
的原因可能是他們」基本上就是global variables。即便如此,它們在一些環境中被廣泛使用。例如,在長時間運行的Web服務中。例如,在Java和Spring Framework中,默認的bean類型是單例,並且通常控制器,服務和對象都是單例(就是說框架只實例化一個實例)。它們不需要鎖定,也是線程安全的,因爲按照慣例它們不包含狀態。通常會傳入一個請求上下文,並且控制器/服務/ DAO將對此進行操作。
- 1. 爲什麼setAnimationDidStopSelector不鼓勵?
- 2. 爲什麼Debug.Print不鼓勵?
- 3. 爲什麼不鼓勵使用Resources.getIdentifier()
- 4. 爲什麼使用`!重要`不鼓勵?
- 5. 爲什麼不鼓勵LD_PRELOAD的使用?
- 6. 爲什麼sun.misc不鼓勵使用?
- 7. 爲什麼在SQLAlchemy中不鼓勵這種模式?
- 8. 爲什麼傘架不鼓勵?
- 9. 爲什麼mysql_escape_string非常不鼓勵?
- 10. 爲什麼不鼓勵在Shiny includeScript()中使用絕對路徑?
- 11. 爲什麼jQuery似乎不鼓勵使用常規的OOP?
- 12. 爲什麼在Silverlight 4中不鼓勵使用觸發器?
- 13. 爲什麼棱鏡鼓勵使用服務定位器反模式?
- 14. CNAME鏈不鼓勵?
- 15. 爲什麼django社區鼓勵使用Postgres over Mysql?
- 16. 爲什麼鼓勵使用處理程序的私有變量?
- 17. 爲什麼不可變的null不鼓勵?
- 18. 由於Django不鼓勵將參數傳遞給模板中的函數,因此鼓勵什麼呢?
- 19. 爲什麼不鼓勵Java EE容器中的產卵線程?
- 20. 爲什麼std :: string/std :: map不鼓勵在堆上創建?
- 21. Ruby爲什麼不鼓勵其他語句?
- 22. 爲什麼不鼓勵直接實例化Dialog類?
- 23. 爲什麼GAE中的URL重寫不被鼓勵?
- 24. 爲什麼不鼓勵前端的OAuth密鑰?
- 25. 爲什麼要標記組件ComVisible(true)不鼓勵?
- 26. 爲什麼Qt不鼓勵圖像的本地化?
- 27. 不鼓勵使用的方法
- 28. 「ObjectMessage的用法一般不鼓勵」,用什麼來代替?
- 29. 爲什麼我鼓勵在本地下載jQuery而不是使用CDN?
- 30. 爲什麼鼓勵java hibernate-mapped對象成爲POJO的對象?
http://en.wikipedia.org/wiki/Singleton_pattern#Drawbacks –
's/Potential/Blatant,exact /' –