🎉 Ура! После трёх лет работы, я наконец выпустил английскую версию книги о паттернах! Вот она »
Одиночка

Одиночка на C#

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

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

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

Подробней об Одиночке

Особенности паттерна на C#

Сложность:

Популярность:

Применимость: Многие программисты считают Одиночку антипаттерном, поэтому его всё реже и реже можно встретить в C#-коде.

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

Концептуальный пример

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

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

using System;

namespace Singleton
{
    // Класс Одиночка предоставляет метод getInstance, который позволяет
    // клиентам получить доступ к уникальному экземпляру одиночки.
    class Singleton
    {
        private static Singleton _instance;

        private static object _lock = new object();

        private Singleton()
        { }

        // Статический метод, управляющий доступом к экземпляру одиночки.
        //
        // Эта реализация позволяет вам расширять класс Одиночки, сохраняя
        // повсюду только один экземпляр каждого подкласса.
        public static Singleton getInstance()
        {
            lock (_lock)
            {
                return _instance ?? (_instance = new Singleton());
            }
        }
    }

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

            if (s1 == s2)
            {
                Console.WriteLine("Singleton works, both variables contain the same instance.");
            }
            else
            {
                Console.WriteLine("Singleton failed, variables contain different instances.");
            }
        }
    }
}

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

Singleton works, both variables contain the same instance.

Одиночка in Other Languages

Одиночка in Java Одиночка in PHP Одиночка in Python Одиночка in TypeScript