Проблемы паттерна `Singleton`

175
20 сентября 2017, 09:27

Изучая паттерн Singleton столкнулся с тем ,что классическая реализация данного паттерна очень хромает в плане потокобезопасности и что Lazy-реализация будет намного предпочтительней...

Теперь сам вопрос : можно ли как-то совместить эти две реализации(код попытки ниже) либо есть ли какой-то альтернативный вариант на с# ,который позволит избежать танцев с бубном при использовании данного паттерна .Net разработчику. А если есть ,то не будет ли альтернативный вариант нарушать принципов ООП и не будет ли так же сложно использовать модульное тестирование .

Например,здесь - Замена синглтона в php ,где с класса Singleton просто делают самый обычный класс ,но сам объект при надобности - создают при помощи IoC-контейнера . Хотелось бы узнать оптимальный вариант в даной ситуации ,спасибо.

Ну и попытка совместить Lazy Loading с потокобезопасной реализацией :

  public class Singleton
{
    public string Name { get; private set; }
    private Singleton()
    {
        Name = System.Guid.NewGuid().ToString();
    }
   public static Singleton GetInstance()
{
    return Nested.instance;
}
private class Nested
{
    internal static readonly Singleton instance = new Singleton();
}
}
Answer 1

Реализация от @RusGIS правильная, новотельная еще пример потокобезопасного с msdn
https://msdn.microsoft.com/en-us/library/ff650316.aspx?f=255&MSPPError=-2147217396

using System;

public sealed class Singleton
{
   private static volatile Singleton instance;
   private static object syncRoot = new Object();
   private Singleton() {}
   public static Singleton Instance
   {
      get 
      {
         if (instance == null) 
         {
            lock (syncRoot) 
            {
               if (instance == null) 
                  instance = new Singleton();
            }
         }
         return instance;
      }
   }
}

если используете различный сторонние библиотеки, то для этого, к приему в mvvm фреймворках, есть встроенные инструменты для его реализации.

к примеру MvvmCross:

            CreatableTypes()
            .EndingWith("Service")
            .AsInterfaces()
            .RegisterAsLazySingleton();

или

Mvx.RegisterSingleton<IMyClass>(new MyClass);

можете выбирать.

Answer 2

Вот реализация синглтон + Lazy+ потокобезопасность.

public sealed class LazySingleton
{
    private static readonly Lazy<LazySingleton> _instance = new Lazy<LazySingleton>(() => new LazySingleton());
    LazySingleton() {}
    public static LazySingleton Instance { get { return _instance.Value; } }
}

Данная реализация взята из книги Сергея Теплякова "Паттерны проектирования на платформе .NET."

READ ALSO
SSO SAML token в SOAP web service

SSO SAML token в SOAP web service

Господа, встал такой вопрос - имеется SSO SAML token примерно в таком виде -

166
Сортировка строк в алфавитном порядке

Сортировка строк в алфавитном порядке

Есть свой List - как реализовать,чтобы слова были в алфавитном порядке от 1-ой буквы

469