2010-10-05 59 views
4

我目前正在開發一個我正在使用插件系統的應用程序。爲了提供對配置屏幕的統一訪問,我爲每個必須實現設置界面的插件添加了一個設置類。此外,每個設置類實現Singleton模式,如下圖所示:C# - 有可能通過使用接口實現單例模式嗎?

public sealed class PluginSettings : IPluginSettings 
{ 

    private static readonly PluginSettings instance = new PluginSettings(); 
    private PluginSettings() { } 

    public static PluginSettings Instance 
    { 
     get 
     { 
      return instance; 
     } 
    } 

    # region interface implementation 
    # ... 
    # endregion 

} 

是否有可能已經實現該接口的單例模式?

任何幫助表示讚賞 - 在此先感謝!

回答

11

您可以選擇使用抽象類而不是接口,並在基本抽象類中實現單例。

您可以使用泛型來創建繼承類的單例實例。

+0

我會試試這種方式 - 所有這些解決方案看起來不是太大或不適合我的問題。要繼續學習... ;-) – dhh 2010-10-05 11:09:19

+0

保持壓力,學習需要一生......;) – 2010-10-10 19:03:20

6

對不起沒有。接口沒有實現。

1

你可以有通用接口,是這樣的:

public interface Singleton<T> 
{ 
    T Instance { get; } 
} 
+0

我想你誤解了這個問題。 – Bobby 2010-10-05 09:50:22

+0

嗡嗡聲,這似乎不起作用,因爲爲單例模式定義的「實例」字段是靜態的。任何想法如何解決這個問題? – dhh 2010-10-05 10:01:12

0

可以按如下方式擴展你的接口:

public interface IPluginSettings 
{ 
    IPluginSettings Instance 
    { 
     get; 
    } 
} 

,並在具體的PluginSettings類實現get方法的一些邏輯。

+3

但是,除非你有PluginSettings,否則你無法得到PluginSettings,而你無法得到,因爲你還沒有PluginSettings。 – 2010-10-05 11:03:19

0

看來你最好有一個工廠來構建實現接口的東西(單例)。
已更新
您可以像使用Ninject一樣使用IoC並將接口綁定到常量。嘗試:

Bind<IPluginSettings>().ToConstant(PluginSettings); 
-1

我還沒有,也許嘗試過它,你可以創建一個像

public interface ISingleton<T> 
{ 
    T Instance 
    { 
     get; 
    } 
} 

一個通用的單類的接口

public class Singleton<T> where T : new(){ 
     Singleton() { } 

     public static T Instance 
     { 
      get { return SingletonCreator.instance; } 
     } 

     class SingletonCreator 
     { 
      static SingletonCreator() { } 

      internal static readonly T instance = new T(); 
     } 
} 

然後

public class xxx: ISingleton<xxx>{ 
    public Singleton<xxx> Instance... 
} 
+1

接口的靜態實現將不匹配,它必須作爲實例方法實現,這意味着直到有實例才能獲得實例。 – 2010-10-05 11:02:41

+0

喬恩,你是對的 – pgr 2010-10-05 11:07:52

1

你不能通過inter執行它臉,因爲如果你有喜歡的界面:

public interface ISingleton 
{ 
    ISingleton GetInstance(); 
} 

首先,接口只覆蓋實例方法,不是靜態的,這是你想要的單例模式。其次,GetInstance返回一個單例沒有什麼可強制執行的;它可以,但它也可以每次都返回一個新對象,一個池對象,等等。

這是合理的,單例是一種實現模式,而不是整體設計模式(這是爲什麼它在大多數情況下通常被認爲是反模式的原因之一),所以幾乎沒有任何接口的價值)承諾一個實現,讓接口(一般意義上來說)承諾返回一個可用的實例,並將實現留給有問題的類更好。