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 "

1414voto

Jim Burger Punkte 4319

Umschrieben von Brian Button:

  1. Sie werden im Allgemeinen als globale Instanz verwendet, was ist daran so schlimm? Weil Sie die Abhängigkeiten Ihrer Anwendung in Ihrem Code verstecken, anstatt sie über die Schnittstellen offenzulegen. Etwas global zu machen, um es nicht weiterzugeben, ist eine Code-Geruch .

  2. Sie verstoßen gegen die Grundsatz der einzigen Verantwortung : durch die Tatsache, dass sie ihre eigene Entstehung und ihren Lebenszyklus kontrollieren.

  3. Sie bewirken von Natur aus, dass der Code engmaschig gekoppelt . Das macht es in vielen Fällen schwierig, sie im Test zu überlisten.

  4. Sie tragen den Zustand während der gesamten Lebensdauer der Anwendung mit sich herum. Ein weiterer Schlag für das Testen, da man in eine Situation geraten kann, in der Tests angeordnet werden müssen, was für Unit-Tests ein absolutes No-No ist. Warum? Weil jeder Unit-Test unabhängig von den anderen sein sollte.

494voto

S.Lott Punkte 371691

Singletons lösen ein (und nur ein) Problem.

Ressourcenkonflikt.

Wenn Sie eine Ressource haben, die

( 1 ) kann nur eine einzige Instanz haben, und

( 2 ), die Sie für die Verwaltung dieser einzelnen Instanz benötigen,

brauchen Sie eine Einzelperson .

Dafür gibt es nicht viele Beispiele. Eine Protokolldatei ist das wichtigste. Sie wollen nicht einfach eine einzelne Protokolldatei aufgeben. Sie müssen sie flushen, synchronisieren und ordnungsgemäß schließen. Dies ist ein Beispiel für eine einzelne gemeinsame Ressource, die verwaltet werden muss.

Es ist selten, dass man ein Singleton braucht. Der Grund, warum sie schlecht sind, ist, dass sie sich wie ein weltweit und sie sind ein voll bezahltes Mitglied der GoF _Entwurfsmuster_ Buch.

Wenn Sie glauben, dass Sie ein Global benötigen, machen Sie wahrscheinlich einen schrecklichen Designfehler.

385voto

Phil Wright Punkte 22034

Einige Coding-Snobs betrachten sie nur als verherrlichendes Global. Genauso wie viele Menschen die siehe Aussage gibt es andere, die die Vorstellung hassen, jemals eine weltweit . Ich habe mehrere Entwickler gesehen, die außergewöhnliche Anstrengungen unternommen haben, um eine weltweit weil sie es als Eingeständnis des Scheiterns ansahen. Seltsam, aber wahr.

In der Praxis ist die Singleton Muster ist nur eine Programmiertechnik, die ein nützlicher Teil Ihres Werkzeugkastens von Konzepten ist. Von Zeit zu Zeit werden Sie vielleicht feststellen, dass es die ideale Lösung ist und es deshalb verwenden. Aber wenn Sie es verwenden, nur um sich damit zu brüsten, dass Sie ein Entwurfsmuster ist genauso dumm, wie sich zu weigern, es jemals zu benutzen, weil es nur ein weltweit .

239voto

jason Punkte 656

Misko Hevery von Google hat einige interessante Artikel zu genau diesem Thema...

Singletons sind pathologische Lügner hat ein Beispiel für Unit-Tests, das veranschaulicht, wie Singletons das Herausfinden von Abhängigkeitsketten und das Starten oder Testen einer Anwendung erschweren können. Es ist ein ziemlich extremes Beispiel für Missbrauch, aber der Punkt, den er macht, ist immer noch gültig:

Singletons sind nichts anderes als globale Zustände. Globale Zustände machen es möglich, dass Ihre Objekte heimlich an Dinge herankommen, die nicht in ihren APIs deklariert sind, und infolgedessen machen Singletons Ihre APIs zu pathologischen Lügnern.

Wo sind all die Singletons hin? weist darauf hin, dass es durch Dependency Injection einfach geworden ist, Instanzen zu Konstruktoren zu bringen, die sie benötigen, was die Notwendigkeit hinter den schlechten, globalen Singletons, die im ersten Artikel beanstandet wurden, mindert.

144voto

Cem Catikkas Punkte 7133

Ich denke, die Verwirrung wird dadurch verursacht, dass die Leute die wirkliche Anwendung des Singleton-Musters nicht kennen. Ich kann das nicht genug betonen. Singleton ist no ein Muster zum Einpacken von Globals. Das Singleton-Muster sollte nur verwendet werden, um zu garantieren, dass eine und nur eine Instanz einer bestimmten Klasse während der Laufzeit besteht.

Die Leute denken, Singleton sei böse, weil sie es für Globals verwenden. Diese Verwirrung ist der Grund, warum Singleton verachtet wird. Bitte verwechseln Sie nicht Singletons und Globals. Wenn Sie das Singleton-Muster für den beabsichtigten Zweck verwenden, werden Sie extreme Vorteile daraus ziehen.

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