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 "

76voto

Mike Stone Punkte 43560

Ein Nachteil von Singletons ist, dass man sie nicht so einfach erweitern kann. Sie müssen im Grunde eine Art von Dekorationsmuster oder etwas Ähnliches, wenn Sie ihr Verhalten ändern wollen. Und wenn Sie eines Tages mehrere Möglichkeiten haben wollen, diese eine Sache zu tun, kann es ziemlich schmerzhaft sein, sie zu ändern, je nachdem, wie Sie Ihren Code gestalten.

Eine Sache, die Sie beachten sollten, wenn Sie Singletons verwenden, versuchen Sie, sie an denjenigen weiterzugeben, der sie benötigt, anstatt sie direkt darauf zugreifen zu lassen... Andernfalls, wenn Sie jemals wählen, um mehrere Möglichkeiten, die Sache, die Singleton tut haben, wird es ziemlich schwierig zu ändern, da jede Klasse eine Abhängigkeit einbettet, wenn es das Singleton direkt zugreift.

Also grundsätzlich:

public MyConstructor(Singleton singleton) {
    this.singleton = singleton;
}

statt:

public MyConstructor() {
    this.singleton = Singleton.getInstance();
}

Ich glaube, diese Art von Muster wird als Dependency Injection und wird im Allgemeinen als eine gute Sache angesehen.

Aber wie bei jedem Muster... Denken Sie darüber nach und überlegen Sie, ob seine Verwendung in der gegebenen Situation unangemessen ist oder nicht... Regeln sind dazu da, gebrochen zu werden, und Muster sollten nicht unüberlegt und unkontrolliert angewendet werden.

71voto

Kimoz Punkte 375

Das Singleton-Muster ist an sich kein Problem. Das Problem ist, dass das Muster oft von Personen verwendet wird, die Software mit objektorientierten Werkzeugen entwickeln, ohne ein solides Verständnis von OO-Konzepten zu haben. Wenn Singletons in diesem Kontext eingeführt werden, neigen sie dazu, zu unüberschaubaren Klassen heranzuwachsen, die für jede noch so kleine Verwendung Hilfsmethoden enthalten.

Singletons sind auch aus der Sicht des Testens ein Problem. Sie neigen dazu, isolierte Unit-Tests zu erschweren. Umkehrung der Kontrolle (IoC) und Dependency Injection sind Muster, mit denen dieses Problem auf objektorientierte Weise gelöst werden soll, die sich für Unit-Tests anbietet.

In einem gesammelter Müll Umgebung können Singletons im Hinblick auf die Speicherverwaltung schnell zu einem Problem werden.

Es gibt auch das Multi-Thread-Szenario, in dem Singletons zu einem Engpass und zu einem Synchronisationsproblem werden können.

56voto

jwanagel Punkte 4038

Ein Singleton wird mit einer statischen Methode implementiert. Statische Methoden werden von Leuten, die Unit-Tests durchführen, vermieden, weil sie nicht gespottet oder gestubbt werden können. Die meisten Leute auf dieser Seite sind große Befürworter von Unit-Tests. Die allgemein akzeptierte Konvention um sie zu vermeiden ist die Verwendung der Umkehrung der Steuerschuldnerschaft Muster.

47voto

Uooo Punkte 6016

Singletons sind auch schlecht, wenn es um Clustering . Denn dann haben Sie nicht mehr "genau ein Singleton" in Ihrer Anwendung.

Stellen Sie sich die folgende Situation vor: Als Entwickler müssen Sie eine Webanwendung erstellen, die auf eine Datenbank zugreift. Um sicherzustellen, dass konkurrierende Datenbankaufrufe nicht miteinander in Konflikt geraten, erstellen Sie eine thread-save SingletonDao :

public class SingletonDao {
    // songleton's static variable and getInstance() method etc. omitted
    public void writeXYZ(...){
        synchronized(...){
            // some database writing operations...
        }
    }
}

So sind Sie sicher, dass nur ein Singleton in Ihrer Anwendung existiert und alle Datenbanken durch dieses eine und einzige SingletonDao . Ihre Produktionsumgebung sieht nun wie folgt aus: Single Singleton

Bis jetzt ist alles in Ordnung.

Stellen Sie sich nun vor, Sie möchten mehrere Instanzen Ihrer Webanwendung in einem Cluster einrichten. Nun haben Sie plötzlich so etwas wie das hier:

Many singletons

Das klingt seltsam, aber Sie haben jetzt viele Einzelstücke in Ihrer Anwendung . Und das ist genau das, was ein Singleton nicht sein soll: Viele Objekte davon zu haben. Das ist besonders schlecht, wenn Sie, wie in diesem Beispiel, synchronisierte Aufrufe an eine Datenbank machen wollen.

Natürlich ist dies ein Beispiel für eine schlechte Verwendung eines Singletons. Aber die Botschaft dieses Beispiels ist: Sie können sich nicht darauf verlassen, dass es genau eine Instanz eines Singletons in Ihrer Anwendung gibt - insbesondere wenn es um Clustering geht.

45voto

jop Punkte 80065
  1. Sie kann leicht als globale Variable (miss)gebraucht werden.
  2. Klassen, die von Singletons abhängen, sind relativ schwieriger isoliert zu testen.

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