C#-是否可以使用接口实现单例模式?
我目前正在开发一个应用程序,其中我使用了一个插件系统。为了提供对配置屏幕的统一访问,我为每个插件添加了一个设置类,它必须实现一个设置接口。此外,每个设置类都应实现singleton模式,如下所示:C#-是否可以使用接口实现单例模式?,c#,design-patterns,interface,singleton,C#,Design Patterns,Interface,Singleton,我目前正在开发一个应用程序,其中我使用了一个插件系统。为了提供对配置屏幕的统一访问,我为每个插件添加了一个设置类,它必须实现一个设置接口。此外,每个设置类都应实现singleton模式,如下所示: public sealed class PluginSettings : IPluginSettings { private static readonly PluginSettings instance = new PluginSettings(); private PluginS
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
}
是否可以在接口中实现单例模式
感谢您的帮助-提前感谢 抱歉,没有。接口没有实现 您可以选择使用抽象类而不是接口,并在基本抽象类中实现单例
您可以使用泛型生成继承类类型的单例实例。您可以使用泛型接口,例如:
public interface Singleton<T>
{
T Instance { get; }
}
公共接口单例
{
T实例{get;}
}
您可以按如下方式扩展界面:
public interface IPluginSettings
{
IPluginSettings Instance
{
get;
}
}
在具体的PluginSettings类中,实现
get
方法的一些逻辑。似乎您最好有一个工厂来构造实现接口的东西(单例)。更新
您可以像Ninject一样使用IoC并将接口绑定到常量。尝试:
Bind<IPluginSettings>().ToConstant(PluginSettings);
Bind().ToConstant(插件设置);
我还没有尝试过,也许你可以创建一个像
public interface ISingleton<T>
{
T Instance
{
get;
}
}
公共接口为单体
{
T实例
{
得到;
}
}
泛型单例类
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();
}
}
公共类单例,其中T:new(){
Singleton(){}
公共静态T实例
{
获取{return SingletonCreator.instance;}
}
类单音创建者
{
静态SingletonCreator(){}
内部静态只读T实例=新T();
}
}
然后
public class xxx: ISingleton<xxx>{
public Singleton<xxx> Instance...
}
公共类xxx:ISingleton{
公共单例实例。。。
}
您不能通过接口强制执行它,因为如果您有如下接口:
public interface ISingleton
{
ISingleton GetInstance();
}
首先,该接口只包含实例方法,而不是静态的,这正是singleton模式所需要的。其次,没有强制执行GetInstance
返回单例;它可以,但也可以每次返回一个新对象,一个池对象,等等
这是合理的,singleton是一种实现模式,而不是一种总体设计模式(这是为什么在大多数情况下它经常被视为反模式的一个原因),因此让一个接口(一般意义上)承诺一个实现没有什么价值,让接口(同样,一般意义上)更好承诺返回一个可用的实例,并将实现留给有问题的类。Hum,这似乎不起作用,因为为singleton模式定义的“实例”字段是静态的。知道如何解决这个问题吗?接口的静态实现不匹配,它必须作为实例方法实现,这意味着只有拥有一个实例才能获得一个实例。但是,只有拥有一个PluginSettings,才能获得PluginSettings,你不能得到,因为你还没有一个插件。我会这样尝试-所有这些解决方案似乎要么太大,要么不适合我的问题。必须继续学习…;-)