Gibt es einen Unterschied zwischen einer Singleton-Klasse und einer Klasse mit? alle statischen Mitglieder (d. h. Methoden und Attribute).
Ich konnte keine Instanz finden, bei der 'alle statischen Memberklassen' nicht erreicht werden die gleiche Funktionalität wie die Klasse Singleton-Muster richtig implementieren?
Für z. java.lang.Runtime
ist eine echte Singleton-Klasse, wohingegen java.lang.System alle statischen Methoden für den Zugriff hat und lediglich einen privaten Konstruktor hat, um externe Konstruktion zu vermeiden. Weiß jemand, warum Klassen wie Runtime
Singleton
gemacht und nicht wie java.lang.System
implementiert wurden.
Ist es nur, weil es ein saubereres Design wäre (d. h. ein Objekt realistischer nachahmt) oder gibt es hier einen Leistungsvorteil?
Ja, es gibt einen Unterschied - ein Singleton kann eine Schnittstelle implementieren.
Auch das, was von außen wie ein Singleton aussieht, kann tatsächlich über verschiedene Klassen implementiert werden, wobei die Singleton-Zugriffsmethode (z. B. Runtime.getRuntime()
) zur Ausführungszeit die richtige Instanz erstellen kann. Ich sage nicht, dass das hier passiert ist, aber es ist eine Option.
Ein Singleton wird einmal instanziiert.
Eine statische Klasse wird niemals instanziiert.
Ich glaube, es gibt keinen Unterschied zwischen dem, was du Singleton und Klasse nennst, mit allen statischen Methoden / Membern im Prinzip. In der Tat denke ich, dass das Erstellen einer Klasse mit allen statischen Mitgliedern eine Möglichkeit ist, das Singleton-Idiom zu implementieren. Nun, vielleicht gibt es in Java einen ernsthaften Unterschied, aber ich spreche aus der Sicht von C ++.
Ich denke, Sie sollten fragen, was sich zwischen der finalen Klasse mit dem privaten Konstruktor und der statischen Klasse unterscheidet. Da Singleton eine Klasse ist und die Implementierung hängt vom Programmierer ab, der diese Klasse programmiert. Es ist dasselbe wie fragen, was Unterschiede zwischen einem Objekt und einer statischen Klasse ist.
Eine Klasse kann erweitert werden, um ein anderes Singleton (z. B. für Testzwecke) oder eine Nicht-Singleton-Klasse zu erstellen. Statische Methoden können nicht überschrieben werden, sie können nur in einer Unterklasse versteckt werden.
Eine häufige Verwendung für Singletons mit verzögerter Initialisierung (alias Meyers-Singletons) besteht darin, die Reihenfolge der Initialisierung statischer Objekte zu steuern (die in C ++ über verschiedene Übersetzungseinheiten hinweg nicht definiert ist). In dieser Hinsicht verhalten sich Singletons einfach wie globale Objekte, aber deren Reihenfolge der Konstruktion verhält sich gut.
Es wird jedoch ziemlich schwierig, die Reihenfolge der Zerstörung zu kontrollieren. Wenn Sie sich darauf verlassen müssen, dass die Singletons in einer bestimmten Reihenfolge zerstört werden (z. B. eine Singleton-Protokollierungsklasse, die andere Singleton-Instanzen überdauern sollte), sehen Sie sich Alexandrescus Buch an, um die Schwierigkeit zu sehen.
Der Hauptzweck für Singletons, die von GoF zitiert werden, ist die Bereitstellung eines polymorphen Dienstes, in dem der Singleton enthalten ist ist eine abstrakte Basisklasse und der konkrete Typ wird zur Laufzeit festgelegt. Und natürlich darf nur einer von ihnen im Programm sein.