Подтвердить что ты не робот

Каковы реальные приложения Синглтона

Duplicate

В шаблонах проектирования: когда использовать Singleton

class Singleton   
{   
    private static Singleton instance;   

    private Singleton() {}   

    public static Singleton Instance   
    {   
        get   
        {
            if (instance == null)   
                instance = new Singleton();   

            return instance;   
        }   
    }   
}  
4b9b3361

Ответ 1

Simple. Что делает синглтон?

  • Он предоставляет глобальный доступ к экземпляру объекта и
  • Это гарантирует, что не более одного экземпляра этого типа может быть когда-либо.

Итак, вы используете синглтон, когда вам нужны оба.

И это редко. Глобалы, вообще говоря, плохие. Мы стараемся избегать их, когда это возможно. И построение вашего приложения вокруг предположения, что "если существует более одного экземпляра, это ошибка", это опасно, потому что вы обычно обнаруживаете, что предположение не выполнялось. Возможно, вы хотите иметь возможность создавать несколько экземпляров локально для целей кеширования. Возможно, вам нужно больше одной базы данных, более одного журнала или, возможно, потоковой производительности, вы должны дать каждому потоку свой собственный экземпляр.

В любом случае вам не нужно применять предположение "только один экземпляр может существовать". Если вам нужен только один экземпляр, просто создайте только один экземпляр. Но оставьте конструктор общедоступным, чтобы можно было создать больше экземпляров, если это окажется необходимым.

Иными словами, обе функции, предлагаемые синглоном, на самом деле отрицательны. В общем, мы не хотим, чтобы наши данные были глобально видимыми, и мы не хотим снимать гибкость без каких-либо причин.

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

Единственное реальное применение синглтонов, которое я когда-либо видел, было "архитектор прочитал книгу GoF и решил повсюду набирать шаблоны дизайна", или "какой-то программист, застрявший в 80-х, не устраивает целая" объектно-ориентированная "вещь и хочет кодировать процедурно, что означает хранение данных в виде глобалов. И синглтоны звучат как способ" ООП ", чтобы сделать глобалы без крика".

Ключевым моментом является то, что singleton смешивает две, очень разные и очень редко требуемые обязанности. Как правило, вы хотите не более одного из них в любом заданном объекте.

Ответ 2

Jon Skeet, THE_SKEET, есть отличная статья, иллюстрирующая различные способы правильной реализации (Thread safe, lazy, performant) шаблона Singleton.

Go читайте здесь.


По популярному спросу (er... downvote) я воспроизвожу версию Skeet:

public sealed class Singleton
{
    Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            return Nested.instance;
        }
    }

    class Nested
    {
        // Explicit static constructor to tell C# compiler
        // not to mark type as beforefieldinit
        static Nested()
        {
        }

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

Здесь экземпляр запускается первой ссылкой на статический член вложенного класса, который встречается только в экземпляре. Это означает, что реализация полностью ленива, но имеет все преимущества производительности предыдущих. Обратите внимание, что хотя вложенные классы имеют доступ к закрытым членам закрывающего класса, обратное неверно, поэтому необходимо, чтобы экземпляр был внутренним. Однако это не вызывает никаких других проблем, поскольку сам класс является частным. Код немного сложнее, чтобы сделать ленту создания, однако.

Ответ 3

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

Ответ 4

Хорошим примером того, где я использовал Singleton, является приложение, которое должно было вызвать компонент веб-службы из нескольких мест в приложении. Мне нужно было поддерживать состояние, инициализировать некоторые поля и поддерживать очередь вызовов и обратных вызовов, поэтому я не мог просто делать статические вызовы. Но я хотел, чтобы только один экземпляр был повторно использован во всем приложении. Я реализовал этот "сервисный" класс как одноэлементный, так что я мог бы назвать его по всему приложению в ответ на множество разных событий, но все они были обработаны в одном месте.

По моему опыту, я использовал синглтоны, где объект использовался много раз в течение жизни приложения, потребовал инициализации и/или был тяжелым. В основном, где есть только один экземпляр класса, где потенциально может быть много экземпляров, и было бы дорого обойтись.

Ответ 5

Предполагая, что ваш вопрос указан в названии:

Я работал с COM-объектом, у которого мог быть только один экземпляр на сервер. Мы разоблачили его для всего приложения ASP.NET с помощью синглета.

Ответ 6

Обратите внимание, что этот код не является безопасным для потоков:

get   
{
   if (instance == null)   
      instance = new Singleton();   
    return instance;   
}   

Один поток может войти в функцию, пройти тест за null и затем приостановить. Затем второй поток мог начать и пройти мимо нулевого теста. С этого момента оба потока в какой-то момент создают свою собственную копию объекта sungleton, только один из которых будет использоваться.

Это может не иметь особого значения на языке GC, таком как С#, но если singleton управляет rresources, отличным от памяти, тогда это имеет значение. Для предотвращения этого вам необходимо использовать дважды проверенный шаблон блокировки.

Ответ 8

вы могли бы найти полезный шаблон Singleton, если у вас есть ресурс, который стоит много, чтобы получить инициализацию, и что вы используете несколько раз, например контекст объекта, когда используете OR/M или какое-то соединение. Очевидно, вы должны обратить внимание на то, что сохранение этой вещи не стоит вам больше, чем воссоздать ее каждый раз.

Ответ 9

Один из способов использования Singleton - реализовать объект "основного контроллера" для приложения. Это было немного похоже на объект приложения, который вы используете с VBA.

Этот объект выполнял различные задачи запуска и завершения работы. Он также обеспечивал доступ к настройкам и услугам всей программы. Это включало значения параметров командной строки и службы ведения журналов, среди прочих.

Ответ 10

Mouse object использует одноэлементный шаблон дизайна.

Ответ 11

Это не Singleton как singleton, обеспечивающий безопасность потоков с помощью ключевых слов для чтения. например -

public sealed class Singleton   
{   
// private static Singleton instance; (instead of this, it should be like this, see below)
private static readonly Singleton instance = new Singleton();     
static Singleton(){}
private Singleton() {}    
public static Singleton Instance
{  get   
   { 
    if (instance == null) 
       instance = new Singleton();  
    return instance;
   }
}
}

Используя это, он обеспечит безопасность протектора и правильный одноэлементный шаблон (то есть он отличается от статического класса). Ваш код для singleton не был потокобезопасным. для получения дополнительной информации о Singleton проверьте эти ссылки: http://csharpindepth.com/articles/general/singleton.aspx http://aspalliance.com/70_Session_Based_Singleton_Object надеюсь, что это поможет и устранит все сомнения в отношении Singleton