2012-02-01 64 views
2


單身人士應該是可繼承的或他們不應該?Singleton應該可以繼承嗎?

根據Gof的說法,「當唯一實例應該可以通過繼承來擴展時,並且客戶端應該能夠在不修改其代碼的情況下使用擴展實例。」

但後來爲什麼我看到的密封及私人構造函數實例上MSDN

+0

什麼是你的原因使用單身?儘量不要。 – Adrian 2012-02-01 17:41:14

+2

閱讀單身標記wiki。 http://stackoverflow.com/tags/singleton/info – Jayy 2012-02-01 17:43:56

+0

@阿德里安:嗯,我想如果我不封印單身人士班的初級程序員可能會繼承它,並可能打破單身模式導致多類實例的childclass Singleton,這就是爲什麼它應該是密封的。 – 2012-02-01 17:47:53

回答

1

在我的項目中,我使用了一個來自Mark Seemanns的書中的依賴注入實現的環境上下文實現。該模式的主要使用點在於,當您詢問當前實例時,必須有某些內容可以通過其他實現進行切換。 F.E.

public class TimeContext 
{ 
    private static TimeContext _instance; 

    public static TimeContext Current 
    { 
     get 
     { 
      if (_instance == null) 
      { 
       _instance = new DefaultContext(); 
      } 
      return _instance; 
     } 
     set 
     { 
      if (value != null) 
      { 
       _instance = value; 
      } 
     } 
    } 
    public abstract DateTime GetDateTime(); 
} 

和上下文的具體實施應該是這樣

public class DefaultContext : TimeContext 
{ 
    public DateTime GetDateTime() 
    { 
     returm DateTime.Now(); 
    } 

} 
+0

F.E ==意思是什麼? – 2012-03-05 17:05:09

+0

您的意思是將對象創建代碼放入基類 – 2012-03-05 17:06:28

+1

f.e.-例如;不只是把默認的創建,以避免獲得可空對象,並且它也適用於單元測試,當你想用設置器模擬默認實現 – Ivan 2012-03-05 18:10:19

1

我覺得你在這裏混合兩種不同的東西。單例模式調用所有調用者使用的單個實例。繼承意味着我可以在類層次結構之間共享公共邏輯。這一點,我覺得,是單例模式的實現: (忽略缺乏鎖定/線程安全的,爲的例子的緣故)

public class Singleton 
{ 
    private static Singleton _instance; 
    public static Singleton Instance 
    { 
     get 
     { 
      if (_instance == null) 
      { 
       // This is the original code. 
       //_instance = new Singleton(); 

       // This is newer code, after I extended Singleton with 
       // a better implementation. 
       _instance = new BetterSingleton(); 
      } 
      return _instance; 
     } 
    } 

    public virtual void ActualMethod() { // whatever } 
} 

public class BetterSingleton : Singleton 
{ 
    public override void ActualMethod() { // newer implementation } 
} 

我們仍然有一個單身,通過Singleton類的靜態實例成員訪問。但是該實例的確切身份可以通過子類化來擴展。

+0

感謝您放棄答覆+1那麼,現在「DoARuntimeCheck()」做了什麼?一些意見會有所幫助:) – 2012-03-05 15:36:20

+0

我建議在運行時確定具體的單例實現的可能性。我會將代碼更改爲更簡單的版本。 – 2012-03-05 15:39:09

+0

在這裏,我改變它來模擬項目隨着時間的變化:我們過去使用Singleton,現在我們使用BetterSingleton。但是因爲我們使用繼承,調用Singleton.Instance.ActualMethod()的代碼不知道或關心我們切換實現。 – 2012-03-05 15:40:53