Welcher reale (dh 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 von ihnen ist threadsicher. Gibt es noch einen anderen Unterschied?
design-patterns
static
singleton
Jorge Córdoba
quelle
quelle
getInstance()
Methode jedes Mal aufgerufen werden muss, wenn Sie sie verwenden möchten (obwohl dies in den meisten Fällen wahrscheinlich keine Rolle spielt ).singleton
Objekt, bei demstatic
Methoden nur Funktionen sind, eine Nicht-OO-Entität.Antworten:
Was lässt Sie sagen, dass entweder eine Singleton- oder eine statische Methode nicht threadsicher ist? Normalerweise sollten beide implementiert werden, um threadsicher zu sein.
Der große Unterschied zwischen einem Singleton und einer Reihe statischer Methoden besteht darin, dass Singletons Schnittstellen implementieren können (oder von nützlichen Basisklassen abgeleitet sind, obwohl dies meiner Erfahrung nach weniger häufig ist), sodass Sie den Singleton so weitergeben können, als wäre es "nur eine andere" " Implementierung.
quelle
Foo
und Sie haben eine Methode, die aFoo
als Parameter verwendet. Mit diesem Setup können Anrufer den Singleton als Implementierung verwenden - oder sie können eine andere Implementierung verwenden. Die Methode ist vom Singleton entkoppelt. Vergleichen Sie dies mit der Situation, in der die Klasse nur statische Methoden hat - jeder Code, der diese Methoden aufrufen möchte, ist eng mit der Klasse verbunden, da angegeben werden muss, welche Klasse die statischen Methoden enthält.Die wahre Antwort stammt von Jon Skeet in einem anderen Forum hier .
quelle
interface
mit einer Singleton-Klasse implementieren , die statischen Methoden einer Klasse (oder z. B. ein C #static class
) jedoch nicht.quelle
Das Singleton-Muster bietet gegenüber statischen Klassen mehrere Vorteile. Erstens kann ein Singleton Klassen erweitern und Schnittstellen implementieren, während eine statische Klasse dies nicht kann (er kann Klassen erweitern, erbt jedoch nicht ihre Instanzmitglieder). Ein Singleton kann träge oder asynchron initialisiert werden, während eine statische Klasse im Allgemeinen beim ersten Laden initialisiert wird, was zu potenziellen Problemen beim Laden von Klassen führt. Der wichtigste Vorteil ist jedoch, dass Singletons polymorph behandelt werden können, ohne dass ihre Benutzer davon ausgehen müssen, dass es nur eine Instanz gibt.
quelle
static
Klassen sind nicht für irgendetwas, das Staat braucht. Es ist nützlich, um eine Reihe von Funktionen zusammenzustellen, z. B.Math
(oderUtils
in Projekten). Der Klassenname gibt uns also nur einen Hinweis, wo wir die Funktionen finden können und nichts weiter.Singleton
ist mein Lieblingsmuster und ich verwende es, um etwas an einem einzigen Punkt zu verwalten. Es ist flexibler alsstatic
Klassen und kann seinen Zustand beibehalten. Es kann Schnittstellen implementieren, von anderen Klassen erben und die Vererbung zulassen.Meine Regel für die Wahl zwischen
static
undsingleton
:Wenn es eine Reihe von Funktionen gibt, die zusammengehalten werden sollten,
static
ist dies die Wahl. Alles andere, das einmaligen Zugriff auf einige Ressourcen benötigt, könnte als implementiert werdensingleton
.quelle
State
ist die Kombination verschiedener Eigenschaften eines Objekts, die sich normalerweise im Laufe der Zeit ändern. Sie können Google für die formale Definition.Statische Klasse: -
Sie können die Instanz der statischen Klasse nicht erstellen.
Wird automatisch von der .NET Framework Common Language Runtime (CLR) geladen, wenn das Programm oder der Namespace mit der Klasse geladen wird.
Statische Klasse kann keinen Konstruktor haben.
Wir können die statische Klasse nicht an method übergeben.
Wir können die statische Klasse nicht an eine andere statische Klasse in C # erben.
Eine Klasse mit allen statischen Methoden.
Bessere Leistung (statische Methoden werden bei der Kompilierung gebunden)
Singleton: -
Sie können eine Instanz des Objekts erstellen und wiederverwenden.
Die Singleton-Instanz wird zum ersten Mal erstellt, wenn der Benutzer dies anfordert.
Die Singleton-Klasse kann einen Konstruktor haben.
Sie können das Objekt der Singleton-Klasse erstellen und an die Methode übergeben.
Die Singleton-Klasse sagt keine Einschränkung der Vererbung aus.
Wir können die Objekte einer Singleton-Klasse, aber nicht einer statischen Klasse entsorgen.
Methoden können überschrieben werden.
Kann bei Bedarf verzögert geladen werden (statische Klassen werden immer geladen).
Wir können eine Schnittstelle implementieren (statische Klasse kann keine Schnittstelle implementieren).
quelle
Eine statische Klasse hat nur statische Methoden, für die ein besseres Wort "Funktionen" wäre. Der in einer statischen Klasse verkörperte Designstil ist rein prozedural.
Singleton hingegen ist ein Muster, das für das OO-Design spezifisch ist. Es handelt sich um eine Instanz eines Objekts (mit allen damit verbundenen Möglichkeiten, wie z. B. Polymorphismus), mit einem Erstellungsverfahren, das sicherstellt, dass es während seiner gesamten Lebensdauer immer nur eine Instanz dieser bestimmten Rolle gibt.
quelle
Im Singleton-Muster können Sie den Singleton als Instanz eines abgeleiteten Typs erstellen. Dies ist mit einer statischen Klasse nicht möglich.
Kurzes Beispiel:
quelle
Um Jon Skeets Antwort zu erweitern
Singletons sind einfacher zu bearbeiten, wenn eine Klasse getestet wird. Überall dort, wo Sie Singletons als Parameter übergeben (Konstruktoren, Setter oder Methoden), können Sie stattdessen eine verspottete oder gestoppelte Version des Singletons ersetzen.
quelle
MySingleton mockOfMySingleton = mock(MySingleton.class)
.new ClazzToTest(mockSingleton);
Hier ist ein guter Artikel: http://javarevisited.blogspot.com.au/2013/03/difference-between-singleton-pattern-vs-static-class-java.html
Statische Klassen
Methoden können nicht überschrieben werden, aber Methoden können ausgeblendet werden. ( Was versteckt eine Methode in Java? Selbst die JavaDoc-Erklärung ist verwirrend. )
Singleton
Zusammenfassend würde ich nur statische Klassen verwenden, um util-Methoden zu halten, und Singleton für alles andere.
Bearbeitungen
statische Klassen werden ebenfalls faul geladen. Danke @jmoreno ( Wann findet die statische Klasseninitialisierung statt? )
Methode für statische Klassen versteckt. Danke @MaxPeng.
quelle
Animal animal = new Cat();
dannanimal.foo();
was passiertEin weiterer Vorteil eines Singletons besteht darin, dass er leicht serialisiert werden kann. Dies kann erforderlich sein, wenn Sie seinen Status auf einer Disc speichern oder an einen anderen Ort senden müssen.
quelle
Ich bin kein großartiger OO-Theoretiker, aber nach meinem Wissen ist das einzige OO-Merkmal, das statischen Klassen im Vergleich zu Singletons fehlt, der Polymorphismus. Aber wenn Sie es nicht brauchen, können Sie mit einer statischen Klasse natürlich Vererbung (nicht sicher über die Schnittstellenimplementierung) und Daten- und Funktionskapselung haben.
Der Kommentar von Morendil: "Der in einer statischen Klasse verkörperte Designstil ist rein prozedural." Ich kann mich irren, aber ich bin anderer Meinung. In statischen Methoden können Sie auf statische Elemente zugreifen. Dies entspricht genau den Singleton-Methoden, die auf ihre einzelnen Instanzmitglieder zugreifen.
edit:
Ich denke jetzt tatsächlich, dass ein weiterer Unterschied darin besteht, dass eine statische Klasse beim Programmstart * instanziiert wird und während der gesamten Lebensdauer des Programms lebt, während ein Singleton irgendwann explizit instanziiert wird und auch zerstört werden kann.
* oder es kann beim ersten Gebrauch instanziiert werden, abhängig von der Sprache, denke ich.
quelle
Um Jons Punkt zu veranschaulichen, kann das, was unten gezeigt wird, nicht ausgeführt werden, wenn Logger eine statische Klasse war. Die Klasse
SomeClass
erwartet, dass eine Instanz derILogger
Implementierung an ihren Konstruktor übergeben wird.Die Singleton-Klasse ist wichtig, damit die Abhängigkeitsinjektion möglich ist.
quelle
Nun, ein Singleton ist nur eine normale Klasse, die instanziiert wird, aber nur einmal und indirekt aus dem Client-Code. Statische Klasse wird nicht instanziiert. Soweit ich weiß, sind statische Methoden (statische Klassen müssen statische Methoden haben) schneller als nicht statische.
Bearbeiten:
Beschreibung der FxCop-Leistungsregel: "Methoden, die nicht auf Instanzdaten zugreifen oder Instanzmethoden aufrufen, können als statisch markiert werden (in VB freigegeben). Danach sendet der Compiler nicht virtuelle Aufrufseiten an diese Mitglieder, wodurch a verhindert wird Überprüfen Sie zur Laufzeit für jeden Aufruf, der sicherstellt, dass der aktuelle Objektzeiger nicht null ist. Dies kann zu einem messbaren Leistungsgewinn für leistungsabhängigen Code führen. In einigen Fällen stellt der Fehler beim Zugriff auf die aktuelle Objektinstanz ein Korrektheitsproblem dar. "
Ich weiß eigentlich nicht, ob dies auch für statische Methoden in statischen Klassen gilt.
quelle
Singletons werden instanziiert, es gibt nur eine Instanz, die jemals instanziiert wurde, daher die Single in Singleton.
Eine statische Klasse kann nur durch sich selbst instanziiert werden.
quelle
Hauptunterschiede sind:
quelle
Singleton ist aus Testsicht ein besserer Ansatz. Im Gegensatz zu statischen Klassen kann Singleton Schnittstellen implementieren, und Sie können eine Scheininstanz verwenden und diese einfügen.
Im folgenden Beispiel werde ich dies veranschaulichen. Angenommen, Sie haben eine Methode isGoodPrice (), die eine Methode getPrice () verwendet, und Sie implementieren getPrice () als Methode in einem Singleton.
Singleton mit getPrice-Funktionalität:
Verwendung von getPrice:
Endgültige Singleton-Implementierung:
Testklasse:
Wenn wir die Alternative der Verwendung einer statischen Methode zur Implementierung von getPrice () wählen, war es schwierig, getPrice () zu verspotten. Sie könnten statisch mit Power-Mock verspotten, aber nicht alle Produkte könnten es verwenden.
quelle
Ich stimme dieser Definition zu:
Sie können interessante andere Unterschiede finden über: Singleton Pattern Versus Static Class
quelle
Ein bemerkenswerter Unterschied ist die unterschiedliche Instanziierung, die mit Singletons einhergeht.
Bei statischen Klassen wird es von der CLR erstellt und wir haben keine Kontrolle darüber. Bei Singletons wird das Objekt bei der ersten Instanz instanziiert, auf die zugegriffen werden soll.
quelle
In vielen Fällen haben diese beiden keinen praktischen Unterschied, insbesondere wenn sich die Singleton-Instanz nie oder nur sehr langsam ändert, z. B. wenn Konfigurationen gehalten werden.
Ich würde sagen, der größte Unterschied ist, dass ein Singleton immer noch eine normale Java Bean ist, im Gegensatz zu einer speziellen statischen Java-Klasse. Aus diesem Grund wird ein Singleton in vielen weiteren Situationen akzeptiert. Dies ist in der Tat die Standard-Instanziierungsstrategie von Spring Framework. Der Verbraucher kann oder kann nicht wissen, dass es sich um einen Singleton handelt, der herumgereicht wird. Er behandelt ihn einfach wie eine normale Java-Bean. Wenn sich die Anforderungen ändern und ein Singleton stattdessen zum Prototyp werden muss, wie wir oft im Frühjahr sehen, kann dies völlig nahtlos erfolgen, ohne dass eine Codezeile für den Verbraucher geändert werden muss.
Jemand anderes hat zuvor erwähnt, dass eine statische Klasse rein prozedural sein sollte, z. B. java.lang.Math. Meiner Meinung nach sollte eine solche Klasse niemals herumgereicht werden und niemals etwas anderes als statisches Finale als Attribute enthalten. Verwenden Sie für alles andere einen Singleton, da dieser viel flexibler und einfacher zu warten ist.
quelle
Wir haben unser DB-Framework, das Verbindungen zum Back-End herstellt. Um fehlerhafte Lesevorgänge zwischen mehreren Benutzern zu vermeiden, haben wir Singleton-Muster verwendet, um sicherzustellen, dass zu jedem Zeitpunkt eine einzelne Instanz verfügbar ist.
In c # kann eine statische Klasse keine Schnittstelle implementieren. Wenn eine einzelne Instanzklasse eine Schnittstelle für Geschäftsverträge oder IoC-Zwecke implementieren muss, verwende ich hier das Singleton-Muster ohne statische Klasse
Singleton bietet eine Möglichkeit, den Status in zustandslosen Szenarien beizubehalten
Hoffe das hilft dir ..
quelle
quelle
ein. Serialisierung - Statische Mitglieder gehören zur Klasse und können daher nicht serialisiert werden.
b. Obwohl wir den Konstruktor privat gemacht haben, werden statische Elementvariablen weiterhin in die Unterklasse übertragen.
c. Wir können keine verzögerte Initialisierung durchführen, da alles nur beim Laden der Klasse geladen wird.
quelle
Aus Client-Sicht ist dem Client statisches Verhalten bekannt, das Singleton-Verhalten kann jedoch vor einem Client verborgen abgeschlossen werden. Der Kunde wird möglicherweise nie erfahren, dass es nur eine einzige Instanz gibt, mit der er immer wieder herumspielt.
quelle
Ich habe folgendes gelesen und denke, dass es auch Sinn macht:
aus dem Buch Objected-Oriented Thought Process 4th Ed.
quelle
In einem Artikel, den ich geschrieben habe, habe ich meinen Standpunkt beschrieben, warum der Singleton viel besser ist als eine statische Klasse:
quelle
Wir können das Objekt der Singleton-Klasse erstellen und an die Methode übergeben.
Die Singleton-Klasse unterliegt keiner Einschränkung der Vererbung.
Wir können die Objekte einer statischen Klasse nicht entsorgen, sondern eine Singleton-Klasse.
quelle
Unterscheidung von der statischen Klasse
JDK enthält Beispiele für Singleton und Static. Einerseits
java.lang.Math
handelt es sich um eine letzte Klasse mit statischen Methoden, andererseitsjava.lang.Runtime
um eine Singleton-Klasse.Vorteile von Singleton
Wenn Sie den Status als Singleton-Muster beibehalten müssen, ist dies die bessere Wahl als die statische Klasse, da das Beibehalten des Status in der statischen Klasse zu Fehlern führt, insbesondere in einer gleichzeitigen Umgebung, die zu Race-Bedingungen führen können, ohne dass eine parallele Synchronisierung durch mehrere Threads erfolgt.
Die Singleton-Klasse kann faul geladen werden, wenn es sich um ein schweres Objekt handelt, aber die statische Klasse hat keine solchen Vorteile und wird immer eifrig geladen.
Mit Singleton können Sie Vererbung und Polymorphismus verwenden, um eine Basisklasse zu erweitern, eine Schnittstelle zu implementieren und verschiedene Implementierungen bereitzustellen.
Da statische Methoden in Java nicht überschrieben werden können, führen sie zu Inflexibilität. Auf der anderen Seite können Sie in der Singleton-Klasse definierte Methoden überschreiben, indem Sie sie erweitern.
Nachteile der statischen Klasse
Vorteile der statischen Klasse
Es gibt mehrere Realisierungen von Singleton-Mustern mit jeweils Vor- und Nachteilen.
Detaillierte Beschreibung Jeder von ihnen ist zu ausführlich, deshalb habe ich nur einen Link zu einem guten Artikel eingefügt - Alles, was Sie über Singleton wissen wollen
quelle
Es gibt einen großen Unterschied zwischen einer einzelnen statischen Klasseninstanz (dh einer einzelnen Instanz einer Klasse, die zufällig eine statische oder globale Variable ist) und einem einzelnen statischen Zeiger auf eine Instanz der Klasse auf dem Heap:
Wenn Ihre Anwendung beendet wird, wird der Destruktor der statischen Klasseninstanz aufgerufen. Das heißt, wenn Sie diese statische Instanz als Singleton verwendet haben, funktioniert Ihr Singleton nicht mehr ordnungsgemäß. Wenn noch Code ausgeführt wird, der diesen Singleton verwendet, z. B. in einem anderen Thread, stürzt dieser Code wahrscheinlich ab.
quelle
Der Unterschied in meinem Kopf besteht in der Implementierung der objektorientierten Programmierung (Singleton / Prototype) oder der funktionalen Programmierung (Static).
Wir konzentrieren uns zu sehr auf die Anzahl der Objekte, die durch Singleton-Muster erstellt wurden, wenn wir uns darauf konzentrieren sollten, dass wir am Ende ein Objekt halten. Wie andere bereits gesagt haben, kann es erweitert, als Parameter übergeben werden, aber vor allem ist es zustandsreich.
Andererseits wird statisch verwendet, um eine funktionale Programmierung zu implementieren. Die statischen Elemente gehören zu einer Klasse. Sie sind staatenlos.
Wussten Sie übrigens, dass Sie statische Singleton-Klassen erstellen können :)
quelle