Looking for c# Keywords? Try Ask4Keywords

C# Language Шаблон Singleton


пример

Шаблон Singleton предназначен для ограничения создания класса ровно на один экземпляр.

Этот шаблон используется в сценарии, где имеет смысл иметь только одно из следующего:

  • один класс, который организует взаимодействия других объектов, например. Класс менеджера
  • или один класс, который представляет собой уникальный, единственный ресурс, например. Компонент регистрации

Одним из наиболее распространенных способов реализации шаблона Singleton является статический заводский метод, такой как CreateInstance() или GetInstance() (или статическое свойство в C #, Instance ), который затем предназначен для возврата одного и того же экземпляра.

Первый вызов метода или свойства создает и возвращает экземпляр Singleton. После этого метод всегда возвращает один и тот же экземпляр. Таким образом, существует только один экземпляр объекта singleton.

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

Вот типичный пример кода для реализации шаблона Singleton в C #:

class Singleton
{
    // Because the _instance member is made private, the only way to get the single 
    // instance is via the static Instance property below. This can also be similarly 
    // achieved with a GetInstance() method instead of the property.
    private static Singleton _instance = null;

    // Making the constructor private prevents other instances from being 
    // created via something like Singleton s = new Singleton(), protecting
    // against unintentional misuse.
    private Singleton()
    {
    }

    public static Singleton Instance
    {
        get 
        {
            // The first call will create the one and only instance.
            if (_instance == null)
            {
                _instance = new Singleton();
            }

            // Every call afterwards will return the single instance created above.
            return _instance;
        }
    }
}

Чтобы проиллюстрировать этот шаблон далее, приведенный ниже код проверяет, возвращается ли идентичный экземпляр Singleton, когда свойство экземпляра вызывается более одного раза.

class Program
{
    static void Main(string[] args)
    {
        Singleton s1 = Singleton.Instance;
        Singleton s2 = Singleton.Instance;
        
        // Both Singleton objects above should now reference the same Singleton instance.
        if (Object.ReferenceEquals(s1, s2))
        {
            Console.WriteLine("Singleton is working");
        }
        else
        {
            // Otherwise, the Singleton Instance property is returning something 
            // other than the unique, single instance when called.
            Console.WriteLine("Singleton is broken");
        }
    }
}

Примечание: эта реализация не является потокобезопасной.

Чтобы увидеть больше примеров, в том числе о том, как сделать этот поточно-безопасный, посетите: Реализация Singleton

Синглтоны концептуально похожи на глобальную ценность и вызывают подобные конструктивные недостатки и проблемы. Из-за этого шаблон Singleton широко рассматривается как анти-шаблон.

Посещение «Что так плохо в синглтонах?» для получения дополнительной информации о проблемах, возникающих при их использовании.

В C # у вас есть возможность создать класс static , который делает все члены статическими, а класс не может быть создан. Учитывая это, обычно можно увидеть статические классы, используемые вместо шаблона Singleton.

Для основных различий между ними, посетите C # Singleton Pattern Versus Static Class .