Как реализовать паттерн Singleton в C#?

Этот вопрос проверяет умение реализовать паттерн Singleton с различными методами реализации.

Короткий ответ

В C# можно реализовать паттерн Singleton несколькими способами, включая:

- Не потокобезопасный Singleton.

- Потокобезопасный Singleton.

- Потокобезопасный Singleton с двойной проверкой блокировки.

- Singleton без блокировки.

- Использование типа Lazy<T> из .NET 4.0 для ленивой инициализации.

Длинный ответ

Есть несколько способов реализации паттерна Singleton в C# в зависимости от требований к многозадачности и производительности. Рассмотрим разные варианты:

 

Не потокобезопасный Singleton: Это простая реализация, которая не защищена от многозадачности, что может привести к проблемам в многозадачных приложениях.

public class Singleton
{
    private static Singleton instance;
    private Singleton() { }
    public static Singleton Instance
    {
        get
        {
            if (instance == null)
                instance = new Singleton();
            return instance;
        }
    }
}

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

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

    public static Singleton Instance
    {
        get
        {
            lock (lockObject)
            {
                if (instance == null)
                    instance = new Singleton();
            }
            return instance;
        }
    }
}

Потокобезопасный Singleton с двойной проверкой блокировки: Это более эффективная версия, которая минимизирует блокировки.

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

    private Singleton() { }

    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                lock (lockObject)
                {
                    if (instance == null)
                        instance = new Singleton();
                }
            }
            return instance;
        }
    }
}

Singleton без блокировки: Здесь используется механизм .NET Lazy<T> для ленивой инициализации, который сам заботится о потокобезопасности.

public class Singleton
{
    private static readonly Lazy<Singleton> instance = new Lazy<Singleton>(() => new Singleton());

    private Singleton() { }

    public static Singleton Instance => instance.Value;
}

 

Реализация Singleton должна учитывать требования к потокобезопасности. Использование Lazy<T> является наиболее простым и эффективным способом для ленивой инициализации и защиты от многозадачности.

Уровень

  • Рейтинг:

    2

  • Сложность:

    8

Навыки

  • C#

Ключевые слова

Подпишись на C# Developer в телеграм