Сахарный System.Lazy<T>

Очень сложная диаграмма классов 😉

Существует достаточно много объектов, которые нужны нам только в одном экземпляре: пулы программных потоков, кэши, диалоговое окна, объекты ведения журнала, объекты драйверов устройств…

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

 

В .NET Framework 4 появился класс System.Lazy предназначенный для ленивой инициализации.
По умолчанию все открытые и защищенные члены класса Lazy являются потокобезопасными и могут использоваться одновременно несколькими потоками. Эти меры могут быть при необходимости отключены у экземпляра, с помощью параметров конструктора.
Это как раз то, что нужно для реализации полноценного Singleton =) Да и в самом Lazy сладости хватает, дополнительную информацию и комментарии можно почитать на habr 😉

// пример использования System.Lazy
class LazySingleton
{
    public static LazySingleton Instance
    {
        get { return _instance.Value; }
    }

    private LazySingleton()
    {}

    private static readonly Lazy _instance = 
        new Lazy(() => new LazySingleton());
}

Comments