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 "

7voto

Singletons sind NICHT schlecht. Es ist nur schlecht, wenn man etwas global einzigartig macht, das nicht global einzigartig ist.

Es gibt jedoch "Application Scope Services" (denken Sie an ein Messaging-System, das Komponenten interagieren lässt) - dies Ruft ein Singleton auf, eine "MessageQueue" - Klasse, die eine Methode "SendMessage(...)" hat.

Sie können dann von überall aus die folgenden Aktionen durchführen:

MessageQueue.Current.SendMessage(new MailArrivedMessage(...));

Und natürlich tun:

MessageQueue.Current.RegisterReceiver(this);

in Klassen, die IMessageReceiver implementieren.

6voto

Volodymyr Frolov Punkte 1236

Es gibt noch eine weitere Sache über Singles, die noch niemand gesagt hat.

In den meisten Fällen ist "Singletonität" eher ein Detail der Implementierung einer Klasse als ein Merkmal ihrer Schnittstelle. Inversion of Control Container kann diese Eigenschaft vor den Klassenbenutzern verbergen; Sie müssen nur Ihre Klasse als Singleton markieren (mit @Singleton Annotation in Java zum Beispiel) und das war's; IoCC erledigt den Rest. Sie brauchen keinen globalen Zugriff auf Ihre Singleton-Instanz zu gewähren, da der Zugriff bereits von IoCC verwaltet wird. Es ist also nichts falsch an IoC Singletons.

GoF-Singletons sollen im Gegensatz zu IoC-Singletons die "Singletonität" in der Schnittstelle durch die getInstance()-Methode offenlegen, so dass sie unter allem oben Gesagten leiden.

6voto

Sri Punkte 4217

Singletons sind nicht böse, wenn Sie es benutzen richtig & minimal . Es gibt viele andere gute Entwurfsmuster, die den Bedarf an Singleton an einem bestimmten Punkt ersetzen (und auch beste Ergebnisse liefern). Aber einige Programmierer sind sich dieser guten Muster nicht bewusst und verwenden das Singleton für alle Fälle, was das Singleton für sie böse macht.

5voto

mP. Punkte 17565

Erstens sollten eine Klasse und ihre Mitarbeiter in erster Linie ihren beabsichtigten Zweck erfüllen, anstatt sich auf die Abhängigen zu konzentrieren. Die Verwaltung des Lebenszyklus (wann Instanzen erstellt werden und wann sie aus dem Geltungsbereich herausfallen) sollte nicht in die Verantwortung der Klasse fallen. Die anerkannte Best Practice hierfür ist die Entwicklung oder Konfiguration einer neuen Komponente zur Verwaltung von Abhängigkeiten mittels Dependency Injection.

Oft wird Software komplizierter und es ist sinnvoll, mehrere unabhängige Instanzen der Singleton-Klasse mit unterschiedlichen Zuständen zu haben. In solchen Fällen ist es falsch, Code zu schreiben, um einfach das Singleton zu übernehmen. verwenden Singleton.getInstance() mag für kleine, einfache Systeme in Ordnung sein, aber es funktioniert nicht, wenn man eine andere Instanz der gleichen Klasse benötigt.

Keine Klasse sollte als Singleton betrachtet werden, sondern es sollte eine Anwendung sein, die sich auf ihre Verwendung bezieht oder auf die Art und Weise, wie sie verwendet wird, um Abhängigkeiten zu konfigurieren. Für ein schnelles und einfaches Programmieren spielt dies keine Rolle - z.B. spielen Dateipfade keine Rolle, aber für größere Anwendungen müssen solche Abhängigkeiten ausgeklammert und auf angemessenere Weise mit DI verwaltet werden.

Die Probleme, die Singleton beim Testen verursachen, sind ein Symptom ihrer hart kodierten Einzelverwendung/Umgebung. Die Testsuite und die vielen Tests sind jeweils individuell und separat, was mit der harten Kodierung eines Singletons nicht vereinbar ist.

5voto

Ycros Punkte 1690

Da es sich im Grunde um objektorientierte globale Variablen handelt, können Sie Ihre Klassen in der Regel so gestalten, dass Sie sie nicht benötigen.

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