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 "

11voto

Martin York Punkte 245363

Singleton ist ein Muster und kann wie jedes andere Werkzeug verwendet oder missbraucht werden.

Der schlechte Teil eines Singletons ist im Allgemeinen der Benutzer (oder sollte ich sagen, die unangemessene Verwendung eines Singletons für Dinge, für die es nicht gedacht ist). Der größte Übeltäter ist die Verwendung eines Singletons als gefälschte globale Variable.

9voto

Roman Odaisky Punkte 2593

Wenn Sie Code mit Singletons schreiben, z. B. einen Logger oder eine Datenbankverbindung, und dann feststellen, dass Sie mehr als einen Log oder mehr als eine Datenbank brauchen, haben Sie ein Problem.

Singletons machen es sehr schwer, von ihnen zu regulären Objekten überzugehen.

Außerdem ist es zu einfach, ein nicht thread-sicheres Singleton zu schreiben.

Anstatt Singletons zu verwenden, sollten Sie alle benötigten Utility-Objekte von Funktion zu Funktion weitergeben. Dies kann vereinfacht werden, wenn Sie alle Objekte in ein Hilfsobjekt verpacken, etwa so:

void some_class::some_function(parameters, service_provider& srv)
{
    srv.get<error_logger>().log("Hi there!");
    this->another_function(some_other_parameters, srv);
}

8voto

Mark Lindell Punkte 852

Das Problem bei Singletons ist der größere Umfang und damit die Kupplung . Es lässt sich nicht leugnen, dass es einige Situationen gibt, in denen Sie Zugang zu einer einzelnen Instanz benötigen, und dies kann auch auf andere Weise erreicht werden.

Ich ziehe es jetzt vor, um eine Umkehrung der Steuerschuldnerschaft (IoC)-Container und ermöglichen die Kontrolle der Lebenszeiten durch den Container. Dies hat den Vorteil, dass die Klassen, die von der Instanz abhängen, nichts von der Tatsache wissen, dass es nur eine einzige Instanz gibt. Die Lebensdauer des Singletons kann in der Zukunft geändert werden. Ein solches Beispiel, das mir kürzlich begegnet ist, war eine einfache Anpassung von Single-Thread zu Multi-Thread.

FWIW, wenn es eine PIA, wenn Sie versuchen, es zu testen, dann ist es zu PIA, wenn Sie versuchen, Debuggen, Bugfix oder es zu verbessern.

8voto

David Punkte 13959

Aktueller Artikel zu diesem Thema von Chris Reath unter Kodierung ohne Kommentare .

Hinweis: Die kommentarlose Kodierung ist nicht mehr gültig. Der Artikel, auf den verwiesen wird, wurde jedoch von einem anderen Benutzer geklont.

http://geekswithblogs.net/AngelEyes/archive/2013/09/08/singleton-i-love-you-but-youre-bringing-me-down-re-uploaded.aspx

8voto

Aaron Powell Punkte 24630

Zu viele Leute packen Objekte, die nicht thread-sicher sind, in ein Singleton-Muster. Ich habe Beispiele für einen DataContext gesehen ( LINQ to SQL ) in einem Singleton-Muster durchgeführt, obwohl der DataContext nicht thread-sicher ist und ein reines Unit-of-Work-Objekt darstellt.

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