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(); }
// При первом обращении к сущность создаётся новый объект, при последующих обращениях возвращается // уже существующий объект. public static DIThreadSafeSingleton CreateInstance(IDependency dependency) { // Если объект уже создан, то не будем тратить ресурсы на более дорогую операцию блокировки if (_threadSafeSingleton == null) { // Блокируем блок кода для других потоков lock (locker) { // Обязательно проверяем, что ничего не изменилось пока выполнялась блокировка if (_threadSafeSingleton == null) { _threadSafeSingleton = new DIThreadSafeSingleton(dependency); // Создаём новый экземпляр } } } return(_threadSafeSingleton); }