Повний посібник із Singletons у C#

У C# синглтон — це шаблон проектування, який обмежує створення екземпляра класу одним об’єктом. Це гарантує наявність лише одного екземпляра класу в усій програмі та забезпечує глобальний доступ до цього екземпляра.

Синглтони та застереження щодо використання

Синглтони корисні з кількох причин:

  • Глобальний доступ: Singletons забезпечують спосіб мати єдиний глобально доступний екземпляр класу. Це може бути корисним, коли є потреба обмінюватися даними або функціями між різними частинами програми без явної передачі посилань на об’єкти.
  • Спільне використання ресурсів: Singletons можна використовувати для керування ресурсами, які мають бути спільними між кількома об’єктами чи компонентами, такими як підключення до бази даних, пули потоків або механізми кешування. За допомогою інкапсуляції управління ресурсами в рамках одного елемента можна гарантувати, що весь доступ до спільного ресурсу проходитиме через централізовану точку, забезпечуючи ефективну координацію та уникаючи конфліктів ресурсів.
  • Створення керованого об’єкта: Singletons дозволяють контролювати створення екземпляра класу та гарантувати, що буде створено лише один екземпляр. Це може бути важливо для обмеження кількості об’єктів, створених через обмеження ресурсів, або для забезпечення певної поведінки, пов’язаної з класом.
  • Ініціалізація за вимогою: Singletons можна ініціалізувати за вимогою, тобто екземпляр створюється лише під час першого доступу до нього. Це може бути корисним для продуктивності, якщо створення об’єкта є дорогим або відкладати створення доти, поки він дійсно не знадобиться.
  • Синхронізація та безпека потоків: реалізації Singleton можуть включати механізми синхронізації, такі як блокування або блокування з подвійною перевіркою, для забезпечення безпеки потоків у багатопоточних середовищах. Це допомагає уникнути умов змагання або неузгоджених станів, коли кілька потоків одночасно отримують доступ до єдиного екземпляра.

Варто зазначити, що синглтони, як і будь-який шаблон дизайну, слід використовувати з розумом. Хоча вони можуть надати переваги, вони також запроваджують глобальний стан і тісний зв’язок, що може ускладнити тестування та обслуговування. Важливо розглянути конкретний варіант використання та оцінити, чи єдиний елемент є найбільш прийнятним рішенням.

Налаштування Singleton

Ось приклад реалізації синглтона в C#:

public sealed class Singleton
{
    private static Singleton instance;
    private static readonly object lockObject = new object();

    private Singleton() { } // Private constructor to prevent instantiation from outside

    public static Singleton Instance
    {
        get
        {
            if (instance == null) // Check if the instance is null
            {
                lock (lockObject) // Use lock to ensure thread safety
                {
                    if (instance == null) // Double-check locking to avoid race conditions
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }

    // Other methods and properties
}

У цьому прикладі клас 'Singleton' має приватний конструктор, який не дозволяє іншим класам створювати його нові екземпляри. Клас надає загальнодоступну статичну властивість під назвою 'Instance', яка відповідає за створення та повернення єдиного екземпляра класу. Під час першого доступу до 'Instance' перевіряється, чи змінна 'instance' має значення null, і якщо так, то використовується блокування для забезпечення безпеки потоку під час створення нового екземпляра.

Подальші виклики 'Instance' повернуть наявний екземпляр без створення нового. Цей підхід гарантує наявність лише одного екземпляра 'Singleton' у всій програмі.

У цьому випадку 'Singleton' є запечатаним класом (зверніть увагу на ключове слово 'sealed' перед оголошенням класу), який є класом, який не можна успадковувати або використовувати як базовий клас для інших класів. Коли клас позначено як запечатаний, це запобігає похідним від нього іншим класам.

Доступ до примірника singleton можна отримати наступним чином:

Singleton singleton = Singleton.Instance;

Цей код дасть посилання на єдиний екземпляр класу 'Singleton', незалежно від того, де він викликається в програмі.

Висновок

Синглтони в C# — це шаблон проектування, який дозволяє створювати один екземпляр класу в усій програмі, забезпечуючи глобальний доступ до цього екземпляра. Вони корисні для сценаріїв, коли необхідно обмінюватися даними або функціями між різними частинами програми, ефективно керувати спільними ресурсами, контролювати створення об’єктів і гарантувати безпеку потоків. Синглтони також можуть включати ініціалізацію за вимогою, коли екземпляр створюється лише під час першого доступу до нього, пропонуючи переваги продуктивності завдяки відкладенню створення доти, доки воно дійсно не знадобиться. Однак важливо використовувати синглетони розумно, враховуючи компроміси та потенційні недоліки, пов’язані з глобальним станом і тісним зв’язком. Необхідно ретельно розглянути конкретний варіант використання, щоб визначити, чи єдиний елемент є найбільш прийнятним рішенням.

Рекомендовані статті
Шаблони проектування C#
Посібник із написання та отримання даних із багатопотокового коду на C#
Найкращий посібник для ноутбуків для розробників C#
7 ефективних порад, щоб швидше вивчити C#
Ultimate Mouse Guide для розробників C#
C# і.NET Framework
Вступ до C#