Есть ли причина иметь нестатический класс со статическими членами вместо того, чтобы делать его статическим?

Я вчера был на собеседовании, и один из вопросов был о том, что такое синглтон и как вы его реализуете.

Реализация MSDN

Решение № 1 от MSDN:

using System;

public class Singleton
{
   private static Singleton instance;

   private Singleton() {}

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

Я дал самое простое решение (решение № 1 из реализации msdn), в то время как он хотел поточно-ориентированное решение (решение № 3).

Решение № 3 от MSDN:

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;
      }
   }
}

Что меня заинтриговало, так это личный конструктор в примере msdn. Я не знал, что такая вещь существует.

Взглянув на MSDN на нем

public class Counter
{
    private Counter() { }
    public static int currentCount;
    public static int IncrementCount()
    {
        return ++currentCount;
    }
}

Я тогда спрашиваю:

Почему у вас есть класс, который имеет только статические члены и, следовательно, хотел бы предотвратить создание его экземпляров и, следовательно, использование частного конструктора вместо того, чтобы делать класс статичным?!

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

1 ответ

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

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

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

Другие вопросы по тегам