單身人士應該是可繼承的或他們不應該?Singleton應該可以繼承嗎?
根據Gof的說法,「當唯一實例應該可以通過繼承來擴展時,並且客戶端應該能夠在不修改其代碼的情況下使用擴展實例。」
但後來爲什麼我看到的密封及私人構造函數實例上MSDN
單身人士應該是可繼承的或他們不應該?Singleton應該可以繼承嗎?
根據Gof的說法,「當唯一實例應該可以通過繼承來擴展時,並且客戶端應該能夠在不修改其代碼的情況下使用擴展實例。」
但後來爲什麼我看到的密封及私人構造函數實例上MSDN
在我的項目中,我使用了一個來自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();
}
}
F.E ==意思是什麼? – 2012-03-05 17:05:09
您的意思是將對象創建代碼放入基類 – 2012-03-05 17:06:28
f.e.-例如;不只是把默認的創建,以避免獲得可空對象,並且它也適用於單元測試,當你想用設置器模擬默認實現 – Ivan 2012-03-05 18:10:19
我覺得你在這裏混合兩種不同的東西。單例模式調用所有調用者使用的單個實例。繼承意味着我可以在類層次結構之間共享公共邏輯。這一點,我覺得,是單例模式的實現: (忽略缺乏鎖定/線程安全的,爲的例子的緣故)
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類的靜態實例成員訪問。但是該實例的確切身份可以通過子類化來擴展。
感謝您放棄答覆+1那麼,現在「DoARuntimeCheck()」做了什麼?一些意見會有所幫助:) – 2012-03-05 15:36:20
我建議在運行時確定具體的單例實現的可能性。我會將代碼更改爲更簡單的版本。 – 2012-03-05 15:39:09
在這裏,我改變它來模擬項目隨着時間的變化:我們過去使用Singleton,現在我們使用BetterSingleton。但是因爲我們使用繼承,調用Singleton.Instance.ActualMethod()的代碼不知道或關心我們切換實現。 – 2012-03-05 15:40:53
什麼是你的原因使用單身?儘量不要。 – Adrian 2012-02-01 17:41:14
閱讀單身標記wiki。 http://stackoverflow.com/tags/singleton/info – Jayy 2012-02-01 17:43:56
@阿德里安:嗯,我想如果我不封印單身人士班的初級程序員可能會繼承它,並可能打破單身模式導致多類實例的childclass Singleton,這就是爲什麼它應該是密封的。 – 2012-02-01 17:47:53