C#20 марта

Паттерн Singleton в C#

Шаблон проектирования Singleton (Одиночка) используется в объектно-ориентированном программировании для ограничения создания экземпляров класса до единственного объекта.

Этот шаблон гарантирует, что только один экземпляр класса будет создан и предоставляет глобальную точку доступа к этому экземпляру.

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

Пример реализации паттерна Singleton в C#:

 

В данном примере класс Singleton имеет приватный конструктор, что означает, что создание объекта класса возможно только изнутри класса.

В классе также объявляется статическая переменная instance, которая хранит ссылку на единственный экземпляр класса.

Метод Instance реализует ленивую инициализацию (lazy initialization), что означает, что экземпляр класса создается только при первом обращении к методу Instance.

Для того чтобы предотвратить создание двух экземпляров класса в многопоточной среде, используется объект lock для синхронизации доступа к методу Instance.

Использование паттерна Singleton позволяет уменьшить количество создаваемых объектов и сэкономить память, что особенно важно при работе с большими и сложными объектами.

Однако, следует помнить, что слишком частое использование паттерна Singleton может привести к усложнению кода и затруднению его тестирования.

 

Singleton (Одиночка) - наивный (небезопасный в многопоточной среде)


Просто реализовать Одиночку несложно — достаточно скрыть конструктор и предоставить статический создающий метод.

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

 Program.cs: Пример структуры паттерна

using System;

namespace RefactoringGuru.DesignPatterns.Singleton.Conceptual.NonThreadSafe
{
    // Класс Одиночка предоставляет метод `GetInstance`, который ведёт себя как
    // альтернативный конструктор и позволяет клиентам получать один и тот же
    // экземпляр класса при каждом вызове.

    // EN : The Singleton should always be a 'sealed' class to prevent class
    // inheritance through external classes and also through nested classes.
    public sealed class Singleton
    {
        // Конструктор Одиночки всегда должен быть скрытым, чтобы предотвратить
        // создание объекта через оператор new.
        private Singleton() { }

        // Объект одиночки храниться в статичном поле класса. Существует
        // несколько способов инициализировать это поле, и все они имеют разные
        // достоинства и недостатки. В этом примере мы рассмотрим простейший из
        // них, недостатком которого является полная неспособность правильно
        // работать в многопоточной среде.
        private static Singleton _instance;

        // Это статический метод, управляющий доступом к экземпляру одиночки.
        // При первом запуске, он создаёт экземпляр одиночки и помещает его в
        // статическое поле. При последующих запусках, он возвращает клиенту
        // объект, хранящийся в статическом поле.
        public static Singleton GetInstance()
        {
            if (_instance == null)
            {
                _instance = new Singleton();
            }
            return _instance;
        }

        // Наконец, любой одиночка должен содержать некоторую бизнес-логику,
        // которая может быть выполнена на его экземпляре.
        public void someBusinessLogic()
        {
            // ...
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // Клиентский код.

                Singleton singleton1 = Singleton.GetInstance();
                Singleton singleton2 = Singleton.GetInstance();

                if (singleton1 == singleton2)
                   {MessageBox.Show($"Синглтон работает, обе переменные содержат один и тот же экземпляр");}                            else {MessageBox.Show($"Ошибка синглтона, переменные содержат разные экземпляры.");

            } } } }

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

Конструктор класса Singleton является закрытым (private), что означает, что экземпляр класса можно создать только изнутри самого класса. Таким образом, другие классы не смогут создать экземпляр этого класса с помощью оператора new.

Статическое поле _instance хранит единственный экземпляр класса Singleton. Если поле _instance равно null, то метод GetInstance() создает новый экземпляр класса Singleton и присваивает его полю _instance. В противном случае, если экземпляр класса уже создан, метод GetInstance() просто возвращает существующий экземпляр.

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

 Output.txt: Результат выполнения

Синглтон работает, обе переменные содержат один и тот же экземпляр.

Свойство get set c#

Комментарии

Добавить комментарий:

Отметьте что вы не робот

Вернуться наверх