Синглтон должен быть наследственным или нет? - PullRequest
2 голосов
/ 01 февраля 2012

Одиночка должна быть наследуемой или не должна быть?

Согласно Gof «когда единственный экземпляр должен быть расширяемым путем создания подклассов, и клиенты должны иметь возможность использовать расширенный экземпляр без изменения своего кода».

но почему я вижу примеры конструктора Sealed и Private на MSDN

Ответы [ 2 ]

1 голос
/ 05 марта 2012

В своих проектах я использую реализацию Ambient Context из книги Марка Симэннса Dependency Injection в .NET. Основной смысл использования этого шаблона заключается в том, что всегда, когда вы запрашиваете экземпляр Current, должно быть что-то, а также Context может переключаться другой реализацией. 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()
    {
        return DateTime.Now();
    }

}
1 голос
/ 04 марта 2012

Я думаю, что вы смешиваете две разные вещи здесь.Шаблон singleton требует одного экземпляра, который используется всеми вызывающими.Наследование просто означает, что я могу разделить общую логику между иерархиями классов.Это, я чувствую, реализация шаблона синглтона: (игнорируйте отсутствие блокировки / безопасности потока, ради примера)

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член.Но точная идентичность этого экземпляра может быть расширена с помощью подклассов.

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