Ich habe unterschiedliche Meinungen über das Singleton-Muster gelesen. Einige vertreten die Ansicht, dass dies unter allen Umständen vermieden werden sollte und andere, dass es in bestimmten Situationen nützlich sein kann.
Eine Situation, in der ich Singletons verwende, besteht darin, dass ich eine Factory (sagen wir ein Objekt f vom Typ F) benötige, um Objekte einer bestimmten Klasse A zu erstellen. Die Factory wird mit einigen Konfigurationsparametern einmal erstellt und dann jedes Mal verwendet, wenn ein Objekt von Typ A wird instanziiert. Also ruft jeder Teil des Codes, der A instanziieren möchte, den Singleton f ab und erstellt die neue Instanz, z
F& f = F::instance();
boost::shared_ptr<A> a = f.createA();
Das allgemeine Szenario für mich ist das
- Ich benötige nur eine Instanz einer Klasse, entweder aus Optimierungsgründen (ich benötige nicht mehrere Factory-Objekte) oder zur Freigabe des gemeinsamen Status (z. B. die Factory weiß, wie viele Instanzen von A noch erstellt werden können).
- Ich brauche eine Möglichkeit, an verschiedenen Stellen des Codes auf diese Instanz f von F zuzugreifen.
Ich interessiere mich nicht für die Diskussion, ob dieses Muster gut oder schlecht ist, aber wenn ich die Verwendung eines Singleton vermeiden möchte, welches andere Muster kann ich verwenden?
Ich hatte die Idee, (1) das Factory-Objekt aus einer Registrierung zu holen oder (2) die Factory zu einem bestimmten Zeitpunkt während des Programmstarts zu erstellen und dann die Factory als Parameter weiterzugeben.
In Lösung (1) ist die Registrierung selbst ein Singleton, daher habe ich das Problem, dass kein Singleton ab Werk verwendet wird, auf die Registrierung verschoben.
Für den Fall (2), dass ich eine erste Quelle (Objekt) benötige, von der das Factory-Objekt stammt, befürchte ich, dass ich erneut auf einen anderen Singleton (das Objekt, das meine Factory-Instanz bereitstellt) zurückgreifen würde. Indem ich dieser Kette von Singletons folge, kann ich das Problem möglicherweise auf einen Singleton (die gesamte Anwendung) reduzieren, mit dem alle anderen Singletons direkt oder indirekt verwaltet werden.
Wäre diese letzte Option (die Verwendung eines ersten Singletons, der alle anderen eindeutigen Objekte erstellt und alle anderen Singletons an den richtigen Stellen einfügt) eine akzeptable Lösung? Ist dies die Lösung, die implizit vorgeschlagen wird, wenn davon abgeraten wird, Singletons zu verwenden, oder was sind andere Lösungen, z. B. im oben dargestellten Beispiel?
BEARBEITEN
Da ich denke, dass der Punkt meiner Frage von einigen missverstanden wurde, finden Sie hier weitere Informationen. Wie z. B. hier erläutert , kann das Wort Singleton (a) eine Klasse mit einem einzelnen Instanzobjekt und (b) ein Entwurfsmuster angeben, das zum Erstellen und Zugreifen auf ein solches Objekt verwendet wird.
Zur Verdeutlichung verwenden wir den Begriff eindeutiges Objekt für (a) und Singleton-Muster für (b). Ich weiß also, was das Singleton-Muster und die Abhängigkeitsinjektion sind (BTW, in letzter Zeit habe ich DI intensiv verwendet, um Instanzen des Singleton-Musters aus einem Code zu entfernen, an dem ich arbeite).
Mein Punkt ist, dass es immer notwendig sein wird, über das Singleton-Muster auf einige eindeutige Objekte zuzugreifen, es sei denn, der gesamte Objektgraph wird aus einem einzelnen Objekt instanziiert, das sich auf dem Stapel der Hauptmethode befindet.
Meine Frage ist, ob die vollständige Erstellung und Verkabelung von Objektgraphen von der Hauptmethode abhängt (z. B. durch ein leistungsfähiges DI-Framework, das das Muster selbst nicht verwendet). Dies ist die einzige singleton-musterfreie Lösung.