2083 Stimmen

Unterschied zwischen statischer Klasse und Singleton-Muster?

Welcher tatsächliche (d. h. praktische) Unterschied besteht zwischen einer statischen Klasse und einem Singleton-Muster?

Beide können ohne Instanziierung aufgerufen werden, beide bieten nur eine "Instanz" und keine von ihnen ist thread-sicher. Gibt es sonst noch einen Unterschied?

4 Stimmen

Abhängig von der Sprachimplementierung und Ihren Verwendungsmustern kann ein Singleton sein könnte weniger effizient aufgrund des Overheads durch den Aufruf der getInstance() Methode jedes Mal, wenn Sie sie verwenden wollen (obwohl wahrscheinlich in den meisten Fällen es spielt keine Rolle ).

5 Stimmen

Es gibt bereits eine Menge Antworten. Es ist eigentlich ein singleton Objekt, bei dem static Methoden sind nur Funktionen, eine Nicht-OO-Entität.

4 Stimmen

Das hängt von der Implementierung ab. csharpindepth.com/Artikel/Allgemeines/Singleton.aspx

1448voto

Jon Skeet Punkte 1325502

Wie kommen Sie darauf, dass entweder ein Singleton oder eine statische Methode nicht thread-sicher ist? Normalerweise sind beide debe so implementiert werden, dass sie thread-sicher sind.

Der große Unterschied zwischen einem Singleton und einem Haufen statischer Methoden besteht darin, dass Singletons Schnittstellen implementieren können (oder von nützlichen Basisklassen abgeleitet sind, obwohl das meiner Erfahrung nach seltener vorkommt), so dass Sie das Singleton weitergeben können, als wäre es "nur eine weitere" Implementierung.

38 Stimmen

Nun, wenn Sie es vorziehen, weder ist inhärent threadsafe, müssen Sie machen sie threadsafe, beide von ihnen, so dass kein Unterschied gibt.

130 Stimmen

Können Sie ein Beispiel für etwas nennen, das ist inhärent fadensicher sind, außer unveränderlichen Typen?

1 Stimmen

Selbst einige unveränderliche Typen sind nicht thread-sicher, wenn sie selbst Kopien eines veränderlichen Objekts sind.

548voto

Kezzer Punkte 17570

Die richtige Antwort kommt von Jon Skeet, in einem anderen Forum hier .

Ein Singleton erlaubt den Zugriff auf eine einzelne erstellte Instanz - diese Instanz (oder oder besser gesagt, eine Referenz auf diese Instanz) kann als Parameter an andere Methoden übergeben und wie ein normales Objekt behandelt.

Eine statische Klasse erlaubt nur statische Methoden.

106 Stimmen

Warum sollten Sie jedoch ein Singleton als Parameter übergeben, wenn Sie auf dieselbe Instanz von fast überall aus zugreifen können, indem Sie die statische Methode getInstance() aufrufen?

31 Stimmen

@HenriqueOrdine Es kann also in bestehenden Code integriert werden und eine Schnittstelle bieten?

0 Stimmen

Ich verstehe, ja. Ich verstehe nicht, warum Sie nicht eine Klasse mit einer Reihe von statischen Methoden als Parameter übergeben können, obwohl, in diesem Fall, wie Sie noch diese Klassen instanziieren können.

399voto

Vadluri Sreenu Punkte 4361
  1. Singleton-Objekte werden gespeichert in Heap gespeichert, aber statische Objekte werden in Stapel .
  2. Wir können klonen. (wenn der Designer es nicht untersagt hat) das Singleton-Objekt, aber wir können das statische Klassenobjekt nicht klonen .
  3. Singleton-Klassen folgen dem OOP (objektorientierte Prinzipien), statische Klassen dagegen nicht.
  4. Wir können eine interface mit einer Singleton-Klasse, aber die statischen Methoden einer Klasse (oder z.B. einer C# static class ) nicht.

145 Stimmen

Die zweite Aussage ist falsch. Wir können kein Singleton-Objekt klonen. Die Singleton-Implementierung muss dies ablehnen. Wenn man Singleton wirklich klonen kann, ist es nicht Singleton.

32 Stimmen

Diese Antwort ist für Java nicht korrekt: weder das Singleton noch das Static verwenden den Stack.

88 Stimmen

Die Nummer 1 ist nicht wichtig. #Nr. 2 beschreibt eine mangelhafte Umsetzung. #Nr. 3 ist völlig unvertretbar.

198voto

neil.johnson Punkte 1907

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, erbt aber nicht deren Instanzmitglieder). Ein Singleton kann verzögert oder asynchron initialisiert werden, während eine statische Klasse im Allgemeinen beim ersten Laden initialisiert wird, was zu Problemen mit dem Klassenlader führen kann. Der wichtigste Vorteil ist jedoch, dass Singletons polymorph gehandhabt werden können, ohne dass ihre Benutzer gezwungen sind, davon auszugehen, dass es nur eine Instanz gibt.

13 Stimmen

+1 für gute, pragmatische Punkte. Das Singleton-Muster wird im Allgemeinen überstrapaziert, aber es gibt ein paar Situationen, in denen es passend ist. Siehe auch: agiletribe.wordpress.com/2013/10/08/

7 Stimmen

Sie haben Recht mit dem Vorteil der Polymorphie. Dies ist der wichtigste Punkt

0 Stimmen

Verschachtelte statische Klasse kann Schnittstelle implementieren. Versuchen Sie, es zu kodieren, wird funktionieren. Ich konnte den Code ohne Fehler kompilieren.

95voto

Xaqron Punkte 27851

static Klassen sind nicht für etwas, das einen Zustand braucht. Sie sind nützlich, um eine Reihe von Funktionen zusammenzufassen, z. B. Math (oder Utils in Projekten). Der Klassenname gibt uns also nur einen Anhaltspunkt, wo wir die Funktionen finden können, mehr nicht.

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

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

Wenn es eine Reihe von Funktionen gibt, die zusammen gehalten werden sollen, dann static ist die Wahl. Alles andere, was einen einzigen Zugang zu einigen Ressourcen benötigt, könnte als singleton .

23 Stimmen

Warum sollten statische Klassen nichts tun, was einen Zustand speichern muss?

14 Stimmen

@Trisped: Sie haben weder eine genaue Kontrolle über die Initialisierung noch über die Finalisierung.

9 Stimmen

Bei "Singleton ist mein Lieblingsmuster" habe ich den Faden verloren. Singleton ist eine so scharfe Ecke, dass es sowohl als Anti-Muster als auch als Muster betrachtet werden sollte. Klassen können sehr wohl statische Zustände haben, das ist auch Single Access, wenn überhaupt, ist statischer Zustand mehr "Single Access" als Singletons, weil die meisten Singleton-Implementierungen gebrochen sind, d.h. man kann das Singleton klonen, während statischer Zustand durch die Definition gesegnet ist, einzigartig zu sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X