2012-12-10 99 views
1

在編碼中,存在一個名爲Singleton的模式,它將一個類的實例化僅限於一個單獨的對象。但是,如果可以在模塊級別實例化類,那麼使用Singleton的原因是什麼?用下劃線命名並使用它?爲什麼和什麼時候應該使用Singleton?什麼時候Singleton模式很重要?

具體(因爲沒有答案真的讓我滿意),這裏是一個具體的例子。我指定一個標準的Python類,並創建一個實例:

class MyObject(object): 
    .... 

_myinstance = MyObject() 

除了這個事實,這種做法不阻止下創建一個二審,什麼情況下是使用辛格爾頓比這個簡單的實現方式更好?

+0

你的問題很有趣。其實如果你不需要單身,不要使用它。 Singleton對可測試性和多線程環境是不利的http://stackoverflow.com/questions/11292109/why-is-singleton-considered-an-anti-pattern-in-java-world-sometimes只是[明智地使用你的單身人士] (http://www.ibm.com/developerworks/webservices/library/co-single/index.html) –

回答

1

當你想重新使用一些昂貴的資源來創建資源時,Singleton模式很有用。由於創建僅在應用程序的整個生命週期內執行一次,因此您只需支付一次該價格。

+0

但是對於這種情況,我也可以在模塊中創建一個昂貴類的單個實例,而不需要使用一個單身人士。也許我不明白? – Alex

+0

@Alex如果這個模塊只屬於你,並且沒有其他人可以訪問它的源代碼,那麼是的。無論如何強迫這個類只創建一次將是一個更好的選擇。 – dantuch

+0

@Alex,是的,確切地說,您可以爲這種情況創建資源的單個實例=>這正是單例模式的實例:-)這就是您將使用的模式的名稱。 –

1

當佔用的內存或需要創建的時間很長時,資源開銷很大時,單例模式很有用。另一個可以發現的單例模式的用法是,可以根據應用程序需求限制一個類的實例數,考慮的一個例子是與數據庫的連接,每個線程總是建立一個連接,那個連接通常和線程一起存在。

0

單例本質上是一個概念,說明某個實體只能有單個實例。單個實例的原因可能有所不同,主要有:

  • 在不同模塊中重複使用可共享資源。
  • 禁止資源的多個實例。
  • 當任何使用模塊尚未準備好時創建實例 - 例如,在任何程序代碼運行之前創建並初始化的全局變量,因此創建使用模塊時,全局就緒。
0

使用單例的原因取決於替代方法。

與客戶端代碼中的某個點顯式創建的對象相比,單例更容易從多個類,包,模塊等訪問。這具有優勢,但可以鼓勵創建過於緊密耦合的代碼。顯式方法使得依賴更加清晰,但是很難實現,特別是在構建現有代碼時。

我在實踐中經常見到的單例的替代方法是實際上是準全局變量集合的「類」。與此相比,單例(或任何對象)是一個巨大的改進,因爲它限制了代碼的不同部分之間的耦合,並且在測試其他類時更容易測試或替換爲存根或模擬。而且,它稍後修改代碼以允許多個實例變得更容易:在很多情況下,只需要一個實例的要求並不是那麼強大,而且這種靈活性可能很有用。

當重構使用一堆全局變量的現有代碼時,單例可以是一個可實現的第一步,如果需要這樣做,那麼可以將其進一步重構爲明確創建的對象並值得額外付出。