2010-08-30 54 views
2

我想知道,我最近讀了一篇文章,談到使用單例模式的缺點,說全球變量發生的缺點,正確地說,單例違反了我們從OOP學校學到的許多規則,單責任原則,接口和抽象類的編程,而不是具體的類......所有這些好東西。我想知道你如何像數據庫連接類一樣工作,你只需要一個連接到你的數據庫和你的數據庫的一個對象漂浮。作者提到了依賴注入原則,我認爲它依賴於依賴倒置規則。我如何知道和控制什麼對象作爲依賴被傳遞,而不是我創建這個類的事實,並期望每個人都使用它,並確保它們使用正確的資源?!面向對象編程原理

+0

IOC + DI:http://martinfowler.com/articles/injection.html – 2010-08-31 00:50:06

回答

3

編輯:這個答案假定你使用的是依賴注入容器,你自己寫的一個,或者你從庫中獲得的。如果沒有,那麼使用DI容器:)

我怎麼知道和控制什麼對象被傳來傳去的比我創建的類並用它玩好,並確保每個人都期待的事實以外的依賴,他們正在使用正確的資源?

合同

的口頭合同 - 你寫了一個設計規範,說:「你不可直接實例化這個類」和「不可繞過你的依賴注入容器有任何對象如果你必須通過容器「。

編譯器契約 - 你給它們一個依賴注入容器,並且它們通過抽象接口抓取它的實例。如果只希望使用單個實例,則可以爲它們提供一個命名實例,它們會同時提取名稱和接口。

ISomething instance = serviceLocator.ResolveInstance<ISomething>(
    "TheInstanceImSupposedToUse"); 

您也可以讓你的所有的具體類民營/內部/什麼具備的,你,只爲他們提供一個抽象的接口來對運行。這將阻止他們自己實例化類。

// This can only be instantiated by you, but can be used by them via ISomething 
private class ConcreteSomething : ISomething 
{ 
    // ... 
} 

通過代碼審查

你讓整個集團的編碼和設計標準的公平性,並確保它們是由組內的每個人都知道。

您使用的是源代碼控制機制,並且在他們簽入之前需要進行代碼審查。您可以閱讀代碼,瞭解它們鏈接的內容,包含哪些標頭,實例化哪些對象以及傳遞哪些實例。

如果他們在代碼審查過程中違反了您的規則,那麼在修復代碼之前不要讓他們簽入。可選地,對於屢犯者,你讓他們付給你一美元,你讓他們買午餐,或者你僱用一個不同的承包商來替換他們。無論在你的組內工作得好:)

2

對於那些誰批評Singleton模式的基礎上,SRP,這裏是一個opposing view。另外,我發現依賴注入容器可以創建儘可能多的問題。也就是說,我正在使用一個很有前途的折中方案,如another post所述。

1

不要把你在任何地方看到的東西當作絕對真理。閱讀它,理解它,然後然後你可以看到什麼時候最好應用某些東西。在你的情況下,你爲什麼不想創建一個靜態單例?

+0

因爲可能會有更好的抽象。通常,更靈活的方法會使代碼更容易重構或重用。例如,有些原因希望能夠並行運行多個版本的代碼,即使通常只想保留一個連接,也可以單獨連接到數據庫。簡單的單例不會讓您靈活地更改設計以支持該場景。 – 2010-08-31 00:42:00

+0

Merlyn我同意你的意見。我正在考慮做一些事情,你剛剛說的話引發了我的想法。很高興! – 2010-09-01 14:14:05