Синглтон без запечатанного класса и проблем безопасности потока - PullRequest
0 голосов
/ 21 июня 2019

Меня попросили написать синглтон в интервью сегодня. Я написал ниже, пожалуйста, обратите внимание, я использовал метод «набор свойств» для установки, а затем я возвратил экземпляр с помощью метода «get». Но я вижу в Интернете, что большинство мест, которые они используют, получают только, значит, то, что я сделал ниже, неправильно? Извините, я не имею VS ide со мной, чтобы проверить это сейчас, поэтому публикуем здесь.

Также некоторые использовали закрытый класс, в том числе с приватным конструктором. Почему запечатаны с личными минусами?

public class Singleton
{
   private static readonly Singleton instance;

   private Singleton() {}

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

   }
}

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

@ Учащийся Поскольку вопрос об интервью и в основном в Индии они просят написать в код Psuedo, чтобы оценить навыки кодирования кандидата, я стараюсь соответствовать требованиям кандидата.

Дизайн хорошопаттерны развивались в течение определенного периода времени с улучшениями в языке программирования, и Singleton не является исключением.Есть много способов, которыми мы можем создать класс Singleton, используя C #.Я хотел бы продемонстрировать некоторые ароматы, которые я могу вспомнить

1.Обычный ванильный синглтон без резьбы

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

2.Синглтон с резьбой Saftey

public sealed class Singleton_ThreadLock
{  
    Singleton_ThreadLock()  
    {  
    }  
    private static readonly object padlock = new object();  
    private static Singleton_ThreadLock instance = null;  
    public static Singleton_ThreadLock Instance  
    {  
        get  
        {  
        // Uses the lock to avoid another resource to create the instance in parallel
            lock (padlock)  
            {  
                if (instance == null)  
                {  
                    instance = new Singleton_ThreadLock();  
                }  
                return instance;  
            }  
        }  
    }  
} 

3.Singleton - двухходовой сейф

public sealed class Singleton_DoubleThreadSafe  
{  
    Singleton_DoubleThreadSafe()  
    {  
    }  
    private static readonly object padlock = new object();  
    private static Singleton_DoubleThreadSafe instance = null;  
    public static Singleton_DoubleThreadSafe Instance  
    {  
        get  
        {  
            if (instance == null)  
            {  
                lock (padlock)  
                {  
                    if (instance == null)  
                    {  
                        instance = new Singleton_DoubleThreadSafe();  
                    }  
                }  
            }  
            return instance;  
        }  
    }  
}

4.Синглтон - ранняя инициализация

public sealed class Singleton_EarlyInitialization  
{  
    private static readonly Singleton_EarlyInitialization instance = new Singleton_EarlyInitialization();
    // Explicit static constructor to tell C# compiler  
    // not to mark type as beforefieldinit  
    static Singleton_EarlyInitialization()  
    {  
    }  
    private Singleton_EarlyInitialization()  
    {  
    }  
    public static Singleton_EarlyInitialization Instance  
    {  
        get  
        {  
            return instance;  
        }  
    }  
}  

5.Singleton - Ленивая инициализация с использованием .Net 4.0+ Framework

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

Предостережения:

  1. Что ж, мало кто создает экземпляр классаиспользуя отражение (я сделал в одном из моих рамок), но его также можно избежать.В сети есть несколько примеров, которые могут показать, как этого избежать
  2. Лучше всего всегда делать класс Singleton запечатанным, так как это ограничит разработчиков от наследования класса.
  3. Существует множествоНа рынке есть IOC, которые могут создавать экземпляр Singleton обычного класса, не следуя приведенной выше реализации Singleton.
0 голосов
/ 21 июня 2019

Мой совет: попытайтесь скомпилировать и запустить код самостоятельно. На сегодняшний день это самый простой способ понять, как это работает.

Если вы попытаетесь создать свой код, вы получите следующую ошибку:

Error   CS0198  A static readonly field cannot be assigned to (except in a static constructor or a variable initializer)

Другими словами, вы должны создать экземпляр вашего экземпляра внутри конструктора.

Что касается вашего вопроса, то для предотвращения доступа извне вашего класса необходим закрытый конструктор, а также достаточно, чтобы другие классы не могли наследовать от вашего класса. Вам не нужно запечатывать.

Вы можете найти действительно хорошее резюме по шаблону синглтона @ https://csharpindepth.com/articles/singleton

...