2010-08-10 65 views
6

我有一些類,它是一個單例,我們有這個類已經有幾個應用程序,它在那裏用作單例。單例類的幾個例子

現在我正在寫一些新的應用程序,我需要該類的幾個實例,具有sevaral實例的最佳實踐是什麼?

通過從中派生出來並使私有構造者公開,我使用c#?

或者在這裏可以有其他想法?

謝謝

+7

@AndréPena:請不要使用標籤來侮辱人或他們的問題。 – BoltClock 2010-08-10 19:10:14

+0

奇怪的情況。請澄清情況。最好的解決辦法是避免單身...... – Shlomo 2010-08-10 19:10:16

+1

這種情況下的「最佳做法」是從中學習:你的單身人士永遠不應該是單身人士。請記住,下次你試圖做一個單身人士。 – jalf 2010-08-10 19:57:25

回答

12

應該只有一個單身人士。如果你有多個,它不是一個Singleton。

也許Multiton是你想要的嗎?

+0

+1從來沒有聽說過這種模式!看起來很有趣。 – BoltClock 2010-08-10 19:10:30

+0

這正是我所需要的,從來沒有聽說過。 – 2010-08-10 19:39:08

+1

單身人士意味着每______(關鍵或其他標準)一個實例。 multiton模式不包含單例模式不包含的任何內容。維基百科文章同意:「大多數人和教科書都認爲這是一種單身模式。」 – 2011-05-18 19:57:07

13

簡單:不要讓它成爲單身。單詞'single'是有原因的。

4

在我看來,如果你需要這個類的幾個實例,那麼你會像處理其他任何東西一樣處理它,你會刪除類中的任何東西,迫使它成爲一個單例,然後它會停止是一個單身人士。

3

您可能會考慮一個可配置爲始終返回相同實例或根據配置或其他條件爲您提供不同實例的工廠類。

+0

喜歡你的答案,但multiton正是我所需要的。 – 2010-08-10 19:39:47

0

你所要求的是非常矛盾的 - 你能否定義Singleton的含義以確保我們不使用不同的詞彙?

如果現有對象是一個真正的靜態單例,那麼你可能無法實例化多個實例;爲了做到這一點,你需要加載他們自己AppDomain中的每個實例(和它的調用者),這不是微不足道的,而且爲了獲得多個單例,這將是一個非常大的權衡。

1

這實際上取決於該類是如何實現爲單例。

如果類有一個私有默認構造函數,並且通過靜態工廠方法創建了單例實例,則唯一的選擇是從該類派生(只要它不是密封的)並在派生類上提供公共構造函數創建多個實例。

如果這個類有一個公共構造函數,並且單例使用只是一個指導,但不是強制執行,那麼您可以創建儘可能多的實例。

但是請注意,如果該類被設計爲單例,它的實現很可能在內部進行了這種假設,因此具有多個實例可能會產生意想不到的副作用。你應該確保這個類已經實現,以便允許這樣的使用場景。

1

一個Singleton是一種設計模式,它爲您提供了兩個確保:

  • 恰好類的一個實例會存在,而且
  • 此項目是全局訪問。

如果您刪除第一個要求,您擁有的不再是單身人士。這是一個普通的,老式的global

所以稱其爲真名。你需要的是一個簡單的全局變量。如果你需要它,你可以用一些懶惰的初始化邏輯來包裝它,但它是全局的,而不是單一的。

除此之外,Singletons are a really really bad idea。首先不要使用它們。