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 "

17voto

Jon Punkte 5112

Ich möchte auf die 4 Punkte in der akzeptierten Antwort eingehen, hoffentlich kann mir jemand erklären, warum ich falsch liege.

  1. Warum ist es schlecht, Abhängigkeiten in Ihrem Code zu verstecken? Es gibt bereits Dutzende von versteckten Abhängigkeiten (C-Laufzeitaufrufe, OS-API-Aufrufe, globale Funktionsaufrufe), und Singleton-Abhängigkeiten sind leicht zu finden (Suche nach instance()).

    "Etwas global zu machen, um zu vermeiden, dass es weitergegeben wird, ist ein Codegeruch." Warum ist die Weitergabe von etwas, um zu vermeiden, dass es ein Singleton ist, kein Code-Geruch?

    Wenn Sie ein Objekt durch 10 Funktionen in einem Aufrufstapel weitergeben, nur um ein Singleton zu vermeiden, ist das so toll?

  2. Grundsatz der Einzelverantwortung: Ich denke, dies ist ein wenig vage und hängt von Ihrer Definition von Verantwortung ab. Eine relevante Frage wäre, warum die Aufnahme dieses spezifisch "Verantwortung" für eine Klassenangelegenheit?

  3. Warum macht die Übergabe eines Objekts an eine Klasse diese enger gekoppelt als die Verwendung dieses Objekts als Singleton innerhalb der Klasse?

  4. Warum ändert sich die Dauer des Zustands? Singletons können manuell erstellt oder zerstört werden, so dass die Kontrolle immer noch vorhanden ist, und Sie können die Lebensdauer gleich der Lebensdauer eines Nicht-Singleton-Objekts machen.

Bezüglich der Einheitstests:

  • nicht alle Klassen müssen eine Einheit bilden getestet werden
  • nicht alle Klassen, die eine Einheit sein müssen getestet werden sollen, müssen die Implementierung des Singletons
  • wenn sie tun einheitlich getestet werden müssen und die Implementierung ändern müssen, ist es einfach, eine Klasse zu ändern, indem man die ein Singleton verwendet, zu ändern, indem das Singleton über Dependency Injection an die Klasse Injektion übergeben wird.

17voto

js. Punkte 1685

Vince Huston hat diese Kriterien, die mir vernünftig erscheinen:

Singleton sollte nur in Betracht gezogen werden, wenn alle drei der folgenden Kriterien erfüllt sind:

  • Das Eigentum an der einzelnen Instanz kann nicht vernünftig zugeordnet werden
  • Eine träge Initialisierung ist wünschenswert
  • Der globale Zugang ist nicht anderweitig vorgesehen

Wenn das Eigentum an der einzelnen Instanz, der Zeitpunkt und die Art der Initialisierung sowie der globale Zugriff keine Rolle spielen, ist Singleton nicht interessant genug.

14voto

tacone Punkte 11183

Singletons sind aus puristischer Sicht schlecht.

Aus praktischer Sicht, ein Singleton ist ein Kompromiss zwischen Zeit und Komplexität .

Wenn Sie wissen, dass sich Ihre Anwendung nicht so sehr ändern wird, ist es ziemlich OK, mit ihnen zu arbeiten. Seien Sie sich nur darüber im Klaren, dass Sie die Dinge möglicherweise umstrukturieren müssen, wenn sich Ihre Anforderungen auf unerwartete Weise ändern (was in den meisten Fällen ziemlich OK ist).

Singletons erschweren manchmal auch Unit-Tests .

13voto

prule Punkte 2478

Ich werde mich nicht zu dem Argument von Gut und Böse äußern, aber ich habe sie nicht mehr benutzt, seit Frühling kam hinzu. Verwendung von Dependency Injection hat meine Anforderungen an Singleton, Servicelocators und Fabriken so gut wie beseitigt. Ich finde dies eine viel produktivere und sauberere Umgebung, zumindest für die Art von Arbeit, die ich mache (Java-basierte Webanwendungen).

12voto

Ben Hoffstein Punkte 99969

An dem Muster ist an sich nichts auszusetzen, vorausgesetzt, es wird für einen Aspekt Ihres Modells verwendet, der wirklich einzigartig ist.

Ich glaube, der Rückschlag ist auf seine übermäßige Verwendung zurückzuführen, die wiederum auf die Tatsache zurückzuführen ist, dass es das am einfachsten zu verstehende und umzusetzende Muster ist.

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