C# - 是否可以通过使用接口实现单例模式?

时间:2010-10-05 09:41:05

标签: c# design-patterns interface singleton

我正在开发一个我正在使用插件系统的应用程序。为了提供对配置屏幕的统一访问,我为每个插件添加了一个必须实现设置界面的设置类。此外,每个Settings类都应实现单例模式,如下所示:

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

}

是否可以在界面中实现单例模式?

任何帮助表示感谢 - 提前致谢!

7 个答案:

答案 0 :(得分:11)

您可以选择使用抽象类而不是接口,并在基本抽象类中实现单例。

您可以使用泛型来创建继承类类型的单例实例。

答案 1 :(得分:6)

抱歉没有。接口没有实现。

答案 2 :(得分:1)

您可以使用Generic界面,例如:

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

答案 3 :(得分:1)

您不能通过界面强制执行,因为如果您有一个类似的界面:

public interface ISingleton
{
  ISingleton GetInstance();
}

首先,接口只覆盖实例方法,而不是静态,这就是你想要的单例模式。其次,没有什么可以强制GetInstance返回单身人士;它可以,但它也可以每次返回一个新对象,一个池化对象,等等。

这是合理的,单例是一种实现模式,不仅仅是一个整体设计模式(在大多数情况下它通常被认为是反模式的一个原因),因此拥有一个接口(在一般意义上)没什么价值承诺一个实现,更好的是让接口(在一般意义上)承诺返回一个可用的实例,并将实现留给相关的类。

答案 4 :(得分:0)

您可以按如下方式扩展您的界面:

public interface IPluginSettings
{
    IPluginSettings Instance
    {
        get;
    }
}

并在具体的PluginSettings类中实现get方法的一些逻辑。

答案 5 :(得分:0)

看起来你最好有一个工厂来构建实现接口的东西(Singleton) <强>已更新
您可以像使用Ninject一样使用IoC并将接口绑定到常量。尝试:

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

答案 6 :(得分:-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...
}