示例#1
0
        static void Main(string[] args)
        {
            // Код содержит несколько реализаций в зависимости от сложности синглтона.
            // Рекомендуется использовать ModernLazy или ThreadSafeSingleton
            ModernLazyThreadSafeSigleton s1 = ModernLazyThreadSafeSigleton.Instance;
            ModernLazyThreadSafeSigleton s2 = ModernLazyThreadSafeSigleton.Instance;

            s1.DoSomething();
            s2.DoSomething();
            if (s1 == s2)
            {
                Console.WriteLine("Объекты являются одинаковыми экземплярами");
            }

            // Пример реализации через DI (Позволяет проводить юнит тесты)
            IDependency           dependency = new Dependency();
            DIThreadSafeSingleton s3         = DIThreadSafeSingleton.CreateInstance(dependency);
            DIThreadSafeSingleton s4         = DIThreadSafeSingleton.CreateInstance(dependency);

            s3.DoSomething();
            s4.DoSomething();
            if (s3 == s4)
            {
                Console.WriteLine("Объекты являются одинаковыми экземплярами");
            }

            Console.ReadKey();
        }
示例#2
0
        // При первом обращении к сущность создаётся новый объект, при последующих обращениях возвращается
        // уже существующий объект.
        public static DIThreadSafeSingleton CreateInstance(IDependency dependency)
        {
            // Если объект уже создан, то не будем тратить ресурсы на более дорогую операцию блокировки
            if (_threadSafeSingleton == null)
            {
                // Блокируем блок кода для других потоков
                lock (locker)
                {
                    // Обязательно проверяем, что ничего не изменилось пока выполнялась блокировка
                    if (_threadSafeSingleton == null)
                    {
                        _threadSafeSingleton = new DIThreadSafeSingleton(dependency); // Создаём новый экземпляр
                    }
                }
            }

            return(_threadSafeSingleton);
        }