2016-03-21 5 views
3

Ich war gestern in einem Interview und eine der Fragen war, was ist ein Singleton und wie implementieren Sie es.Gibt es einen Grund, eine statische Klasse nur mit statischen Elementen zu verwenden, anstatt sie statisch zu machen?

MSDN's implementation

Lösung # 1 von 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; 
     } 
    } 
} 

ich die einfachste Lösung (Lösung Nummer 1 von Msdn Implementierung) gab, während er den Thread-sicher eine (Lösung Nummer 3) gesucht.

Lösung # 3 von 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; 
     } 
    } 
} 

Was ich ist faszinierend ist das privaten Konstruktor in Msdn Vorbild. Ich wusste nicht, dass so etwas existiert.

einen Blick auf msdn on it

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

Taking frage ich dann:

Warum würden Sie eine Klasse, die nur statische Mitglieder hat und damit möchte Instanzen davon verhindern erstellt werden und somit die Nutzung für einen privaten Konstruktor - anstatt die Klasse statisch zu machen?!

PS. Die Frage ist nicht über Singletons - geht es um ein Szenario zu beschreiben, wo ich wählen würde eine instantiable Klasse zu erstellen, die nur statische Mitglieder hat (und damit letztendlich die Notwendigkeit für einen privaten Konstruktor erstellen) statt Verwenden einer statischen Klasse.

+0

Singleton-Beispiele konzentrieren sich im Allgemeinen auf "den Code, der für die Initialisierung des Singleton verantwortlich ist" - in Wirklichkeit hätten Sie Instanzmitglieder, und manchmal würde es eine Schnittstelle implementieren. –

+0

Die wirkliche Antwort, die Sie ihm geben sollten, ist, dass Sie sich nicht mit der Implementierung von Singletons befassen sollten, und stattdessen den IOC-Container verwenden, um die Lebensdauer des Objekts zu steuern. –

+0

Ich frage mich, warum Leute in Programmierinterviews immer noch Fragen zu Singletons stellen. –

Antwort

4

Warum würden Sie haben eine Klasse, die nur statische Mitglieder hat und damit möchte Instanzen davon verhindern erstellt werden und somit die Verwendung für einen privaten Konstruktor - anstatt die Klasse statische

Der Hauptunterschied zwischen der Verwendung eines Singleton über eine statische Klasse besteht darin, dass Sie Schnittstellen auf der ersten Klasse implementieren und diese als solche übergeben können, ohne an die konkreten Implementierungsdetails der Singelton gebunden zu sein, während dies bei einer statischen Klasse nicht möglich ist.

Darüber hinaus müssen die Singleton-Instanzvariablen statisch sein und als normale Instanzmitglieder verfügbar gemacht werden.

+0

Danke Yuval, aber ich sehe alle Kommentare beziehen sich auf Singletons ...obwohl das Thema daraus entwickelt wurde, geht es um etwas anderes - warum sollte ich jemals eine instanziierbare Klasse haben wollen, die nur statische Elemente hat (und somit die Möglichkeit schafft, einen privaten Konstruktor zu benötigen) anstatt eine statische Klasse zu haben? Also gilt deine Antwort auch? Weil ich daran interessiert wäre, dass diese Klasse Schnittstellen implementiert und statische Klassen dies nicht können? – Veverke

+0

Ich glaube generell, dass Sie fast nie eine Instanzmethode nur mit statischen Elementen haben möchten, das macht wenig Sinn. Private Konstruktoren werden an Orten verwendet, an denen der Benutzer nicht explizit eine Instanz erstellen darf. Es kann ein Singleton sein, es kann eine Art Fabrik auf dem Objekt selbst sein (ich bin nicht sicher, ob das Objekt eine eigene Instanz erstellen soll, aber das passiert manchmal). –

+0

Geben Sie +1 für den obigen Kommentar, der sich auf die gestellte Frage bezieht. Vielen Dank. – Veverke