C # - возможно ли реализовать шаблон синглтона с помощью интерфейса? - PullRequest
4 голосов
/ 05 октября 2010

В настоящее время я разрабатываю приложение, в котором я использую систему плагинов.Для обеспечения унифицированного доступа к экрану конфигурации я добавил класс настроек для каждого плагина, который должен реализовывать интерфейс настроек.Кроме того, каждый класс 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 ]

11 голосов
/ 05 октября 2010

При желании вы можете использовать абстрактный класс вместо интерфейса и реализовать синглтон в базовом абстрактном классе.

Вы можете использовать дженерики для создания экземпляра синглтона типа наследующего класса.

6 голосов
/ 05 октября 2010

Извините, нет.Интерфейсы не имеют реализации.

1 голос
/ 05 октября 2010

Вы не можете применить его через интерфейс, потому что, если у вас был такой интерфейс, как:

public interface ISingleton
{
  ISingleton GetInstance();
}

Во-первых, интерфейс охватывает только методы экземпляра, а не статические, что вы хотите длясинглтонВо-вторых, нет ничего, что могло бы обеспечить, чтобы GetInstance возвращало синглтон;он мог бы, но он также мог бы каждый раз возвращать новый объект, объект из пула и т. д.

Это разумно, синглтон - это шаблон реализации, а не шаблон общего проекта (одна из причин, почему егов большинстве случаев часто рассматривается как анти-шаблон), поэтому мало смысла в том, чтобы интерфейс (в общем смысле) обещал реализацию, гораздо лучше иметь интерфейс (опять же, в общем смысле), обещающий вернуть работоспособный экземпляр,и оставьте реализацию на усмотрение рассматриваемого класса.

1 голос
/ 05 октября 2010

Вы можете иметь общий интерфейс, что-то вроде:

public interface Singleton<T> 
{
    T Instance { get; }
}
0 голосов
/ 05 октября 2010

Я не пробовал, может быть, вы можете создать интерфейс, как

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...
}
0 голосов
/ 05 октября 2010

Похоже, вам лучше иметь фабрику для создания чего-то (Singleton), реализующего интерфейс.
ОБНОВЛЕНО
Вы можете использовать IoC как Ninject и привязать интерфейс к константе. Попробуйте:

Bind<IPluginSettings>().ToConstant(PluginSettings);
0 голосов
/ 05 октября 2010

Вы можете расширить свой интерфейс следующим образом:

public interface IPluginSettings
{
    IPluginSettings Instance
    {
        get;
    }
}

и в конкретном классе PluginSettings реализуют некоторую логику метода get.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...