2148 Stimmen

Was sind die Nachteile des Singleton-Musters?

El Singleton-Muster ist ein voll eingezahltes Mitglied der GoF 's Musterbuch aber in letzter Zeit scheint sie in der Welt der Entwickler eher verwaist zu sein. Ich verwende immer noch eine ganze Menge Singletons, vor allem für Fabrikklassen und obwohl man bei Multithreading-Problemen etwas vorsichtig sein muss (wie bei jeder anderen Klasse auch), verstehe ich nicht, warum sie so schrecklich sind.

Stack Overflow scheint vor allem davon auszugehen, dass alle der Meinung sind, dass Singletons böse sind. Warum eigentlich?

Bitte unterstützen Sie Ihre Antworten mit " Fakten, Referenzen oder spezifisches Fachwissen "

4voto

Ewan Makepeace Punkte 5308

Einige Gegenargumente des Autors:

Sie sind aufgeschmissen, wenn Sie die Klasse in Zukunft nicht mehr einzeln verwenden wollen. Ganz und gar nicht - ich war in dieser Situation mit einer einzigen Datenbankverbindung Singleton, die ich in einen Verbindungspool drehen wollte. Denken Sie daran, dass auf jedes Singleton über eine Standardmethode zugegriffen wird:

MyClass.instance

Dies ist vergleichbar mit der Signatur einer Fabrikmethode. Ich habe lediglich die Instanzmethode aktualisiert, um die nächste Verbindung aus dem Pool zurückzugeben - weitere Änderungen waren nicht erforderlich. Das wäre viel schwieriger gewesen, wenn wir NICHT ein Singleton verwendet hätten.

Singletons sind nur ausgefallene Globals Ich kann nicht damit argumentieren, aber so sind alle statischen Felder und Methoden - alles, was von der Klasse und nicht eine Instanz zugegriffen wird, ist im Wesentlichen global und ich sehe nicht so viel Pushback auf die Verwendung von statischen Feldern?

Ich behaupte nicht, dass Singletons gut sind, ich wehre mich nur gegen einige der "konventionellen Weisheiten" hier.

4voto

user22044 Punkte 216

Ein Muster entsteht, wenn mehrere Personen (oder Teams) zu ähnlichen oder identischen Lösungen kommen. Viele Leute verwenden immer noch Singletons in ihrer ursprünglichen Form oder mit Hilfe von Fabrikvorlagen (gute Diskussion in Alexandrescus Modern C++ Design). Gleichzeitigkeit und die Schwierigkeit, die Lebensdauer des Objekts zu verwalten, sind die Haupthindernisse, wobei Ersteres, wie Sie vorschlagen, leicht zu bewältigen ist.

Wie bei allen Entscheidungen gibt es auch bei Singleton Höhen und Tiefen. Ich denke, sie können in Maßen verwendet werden, insbesondere für Objekte, die die Lebensdauer der Anwendung überleben. Die Tatsache, dass sie Globals ähneln (und wahrscheinlich auch sind), hat vermutlich die Puristen aufgeschreckt.

3voto

Daniel Earwicker Punkte 111630

Das ist es, was meiner Meinung nach in den bisherigen Antworten fehlt:

Wenn Sie eine Instanz dieses Objekts pro Prozessadressraum benötigen (und Sie so sicher wie möglich sind, dass sich diese Anforderung nicht ändert), sollten Sie es zu einem Singleton machen.

Andernfalls handelt es sich nicht um ein Singleton.

Dies ist eine sehr merkwürdige Anforderung, die für den Benutzer kaum von Interesse ist. Prozesse und Adressraumisolierung sind ein Detail der Implementierung. Sie wirken sich nur dann auf den Benutzer aus, wenn er Ihre Anwendung mit kill oder Task-Manager.

Abgesehen vom Aufbau eines Zwischenspeichersystems gibt es nicht viele Gründe, warum man sich so sicher sein sollte, dass es nur eine Instanz von etwas pro Prozess geben sollte. Wie wäre es mit einem Logging-System? Es wäre vielleicht besser, wenn es pro Thread oder feinkörniger wäre, damit man den Ursprung von Nachrichten automatischer verfolgen kann. Wie sieht es mit dem Hauptfenster der Anwendung aus? Das kommt darauf an; vielleicht wollen Sie, dass alle Dokumente des Benutzers aus irgendeinem Grund von demselben Prozess verwaltet werden, in diesem Fall gäbe es mehrere "Hauptfenster" in diesem Prozess.

3voto

Frank Grimm Punkte 1141

El Singleton - das Anti-Muster! von Mark Radford (Overload Journal #57 - Oct 2003) ist eine gute Lektüre darüber, warum Singleton als Anti-Muster angesehen wird. Der Artikel erörtert auch zwei alternative Designansätze zum Ersetzen von Singleton.

2voto

Graviton Punkte 79320

Sie verwischt die Trennung der Konzerne .

Angenommen, Sie haben ein Singleton, dann können Sie diese Instanz von überall innerhalb Ihrer Klasse aufrufen. Ihre Klasse ist nicht mehr so rein, wie sie sein sollte. Ihre Klasse operiert nun nicht mehr auf ihren Mitgliedern und den Mitgliedern, die sie explizit erhält. Dies führt zu Verwirrung, da die Benutzer der Klasse nicht wissen, welche Informationen die Klasse benötigt. Die ganze Idee von Verkapselung ist es, das Wie einer Methode vor den Benutzern zu verbergen, aber wenn ein Singleton innerhalb der Methode verwendet wird, muss man den Zustand des Singletons kennen, um die Methode korrekt zu verwenden. Dies ist anti- OOP .

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