Frage Unterschied zwischen statischer Klasse und Singleton-Muster?


Welcher reale (d. H. Praktische) Unterschied besteht zwischen einer statischen Klasse und einem Singleton-Muster?

Beide können ohne Instanziierung aufgerufen werden, beide stellen nur eine "Instanz" bereit und keine davon ist Thread-sicher. Gibt es einen anderen Unterschied?


1489
2018-02-06 08:13


Ursprung


Antworten:


Was lässt Sie sagen, dass entweder ein Singleton oder eine statische Methode nicht threadsicher ist? Normalerweise beides sollte implementiert werden, um threadsicher zu sein.

Der große Unterschied zwischen einem Singleton und einer Reihe von statischen Methoden besteht darin, dass Singletons Schnittstellen implementieren können (oder von nützlichen Basisklassen abstammen, obwohl das meiner Erfahrung nach weniger üblich ist), so dass Sie das Singleton weitergeben können, als wäre es "nur ein anderes " Implementierung.


1042
2018-02-06 08:17



Die wahre Antwort ist von Jon Skeet, auf einem anderen Forum hier.

Ein Singleton ermöglicht den Zugriff auf einen einzelnen   erstellte Instanz - diese Instanz (oder   eher, ein Verweis auf diese Instanz)   kann als Parameter an andere übergeben werden   Methoden und als normal behandelt   Objekt.

Eine statische Klasse erlaubt nur statische   Methoden.


403
2018-02-06 08:21



  1. Singleton-Objekte werden in gespeichert Haufen, aber statische Objekte werden in gespeichert Stapel.
  2. Wir können Klon (wenn der Designer es nicht verbietet) das Singleton-Objekt, aber wir können das statische Klassenobjekt nicht klonen .
  3. Singleton Klassen folgen dem OOP (objektorientierte Prinzipien), statische Klassen nicht.
  4. Wir können ein implementieren interface mit einer Singleton-Klasse, aber die statischen Methoden einer Klasse (oder z. B. eine C # static class) kann nicht.

324
2017-09-11 10:22



Das Singleton-Muster hat mehrere Vorteile gegenüber statischen Klassen. Erstens kann ein Singleton Klassen erweitern und Schnittstellen implementieren, während eine statische Klasse dies nicht kann (sie kann Klassen erweitern, aber sie erbt nicht ihre Instanzmitglieder). Ein Singleton kann träge oder asynchron initialisiert werden, während eine statische Klasse im Allgemeinen initialisiert wird, wenn sie zum ersten Mal geladen wird, was zu Problemen mit dem Klassenladeprogramm führt. Der wichtigste Vorteil ist jedoch, dass Singletons polymorph gehandhabt werden können, ohne dass ihre Benutzer davon ausgehen müssen, dass es nur eine Instanz gibt.


122
2018-02-06 08:30



static Klassen sollten nichts brauchen Zustand, es ist nützlich für die Zusammenlegung von Funktionen, d Math (oder Utils in Projekten). Der Klassenname gibt uns nur einen Hinweis darauf, wo wir die Funktionen finden können und es gibt nichts mehr.

Singleton ist mein Lieblingsmuster und benutzt es, um etwas an einem einzigen Punkt zu verwalten. Es ist flexibler als static Klassen und kann den Zustand beibehalten. Es kann Schnittstellen implementieren, von anderen Klassen erben und Vererbung zulassen.

Meine Regel für die Wahl zwischen static und singleton:

Wenn es eine Reihe von Funktionen gibt, die zusammengehalten werden sollen, dann static ist die Wahl. Alles andere, das Einzelzugriff auf einige Ressourcen benötigt, könnte implementiert werden singleton.


56
2017-12-30 20:55



Statische Klasse: -

  1. Sie können die Instanz der statischen Klasse nicht erstellen.

  2. Wird automatisch von der Common Language Runtime (CLR) von .NET Framework geladen, wenn das Programm oder der Namespace, der die Klasse enthält, geladen wird.

  3. Statische Klasse kann keinen Konstruktor haben.

  4. Wir können die statische Klasse nicht an Methode übergeben.

  5. Wir können die statische Klasse nicht in eine andere statische Klasse in C # übernehmen.

  6. Eine Klasse mit allen statischen Methoden.

  7. Bessere Leistung (statische Methoden sind zur Kompilierzeit gebunden)

Singleton: -

  1. Sie können eine Instanz des Objekts erstellen und es erneut verwenden.

  2. Singleton-Instanz wird zum ersten Mal erstellt, wenn der Benutzer angefordert hat.

  3. Singleton-Klasse kann Konstruktor haben.

  4. Sie können das Objekt der Singleton-Klasse erstellen und an die Methode übergeben.

  5. Singleton-Klasse sagt keine Einschränkung der Vererbung.

  6. Wir können die Objekte einer Singleton-Klasse aber nicht der statischen Klasse disponieren.

  7. Methoden können überschrieben werden.

  8. Kann bei Bedarf geladen werden (statische Klassen werden immer geladen).

  9. Wir können eine Schnittstelle implementieren (die statische Klasse kann keine Schnittstelle implementieren).


49
2018-06-01 11:42



Eine statische Klasse hat nur statische Methoden, für die ein besseres Wort "Funktionen" wäre. Der in einer statischen Klasse verkörperte Design-Stil ist rein prozedural.

Singleton hingegen ist ein für OO-Design spezifisches Muster. Es ist eine Instanz eines Objekts (mit all den Möglichkeiten, die ihm innewohnen, wie zum Beispiel Polymorphismus), mit einer Erstellungs-Prozedur, die sicherstellt, dass es immer nur eine Instanz dieser bestimmten Rolle während ihrer gesamten Lebensdauer gibt.


47
2018-02-06 08:35



Im Singleton-Muster können Sie das Singleton als eine Instanz eines abgeleiteten Typs erstellen. Dies ist bei einer statischen Klasse nicht möglich.

Schnelles Beispiel:

if( useD3D )
    IRenderer::instance = new D3DRenderer
else
    IRenderer::instance = new OpenGLRenderer

32
2018-02-06 08:16



Um weiter zu expandieren Jon Skeets Antwort

Der große Unterschied zwischen einem Singleton und einer Reihe von statischen Methoden besteht darin, dass Singletons Schnittstellen implementieren können (oder von nützlichen Basisklassen abstammen, obwohl das weniger gebräuchliche IME ist), so dass Sie das Singleton weitergeben können, als wäre es "nur eine andere" Implementierung.

Singletons sind einfacher zu handhaben, wenn eine Klasse getestet wird. Überall dort, wo Sie Singletons als Parameter übergeben (Konstruktoren, Setter oder Methoden), können Sie statt dessen eine gespottete oder gestempelte Version des Singletons verwenden.


22
2017-12-20 21:53



Ein weiterer Vorteil eines Singleton besteht darin, dass es leicht serialisiert werden kann, was notwendig sein kann, wenn Sie seinen Status auf der Festplatte speichern oder irgendwo fern senden müssen.


20
2017-08-08 03:36



Ich bin kein großartiger OO-Theoretiker, aber von dem, was ich weiß, denke ich, dass die einzige OO-Eigenschaft, die statische Klassen im Vergleich zu Singletons nicht haben, Polymorphismus ist. Aber wenn Sie es nicht brauchen, können Sie bei einer statischen Klasse natürlich Vererbung (nicht sicher über Schnittstellenimplementierung) und Kapselung von Daten und Funktionen haben.

Der Kommentar von Morendil, "Der in einer statischen Klasse verkörperte Design-Stil ist rein prozedural" Ich könnte falsch liegen, aber ich stimme nicht zu. In statischen Methoden können Sie auf statische Member zugreifen, die genauso wie Singleton-Methoden auf ihre einzelnen Instanzmitglieder zugreifen.

bearbeiten:
Ich denke gerade jetzt, dass ein anderer Unterschied ist, dass eine statische Klasse ist instanziiert bei Programmstart * und lebt während der gesamten Laufzeit des Programms, während ein Singleton irgendwann explizit instanziiert wird und auch zerstört werden kann.

* oder es kann bei der ersten Verwendung instanziiert werden, abhängig von der Sprache, denke ich.


17
2017-08-16 15:54