Deine Lösung, nämlich den Codeabschnitten die Objekte verwenden Referenzen (Zeiger) auf diese Objekte zu übergeben ist die richtige Lösung. Gratuliere dass du einer der wenigen Neulinge bist die sich Gedanken machen und nicht sofort blind darauf vertrauen was schon falsch in vielen Büchern steht
Nein, ein Singleton ist keine globale Variable, auch wenn es leider ständig als solche verwendet wird. Das wichtigste was es über Singletons zu wissen gilt ist dass man Singletons nicht verwendet
Am besten zitiere ich vielleicht einfach mal die beiden am öftesten missverstandenen Sätze in der Geschichte der Softwareentwicklung:
Use the Singleton pattern when
- there must be exactly one instance of a class, and it must be accessible to clients from a well-known access point.
- when the sole instance should be extensible by subclassing, and clients should be able to use an extended instance without modifying their code.
Da steht nirgendwo dass man ein Singleton verwenden soll wenn man bequem von überall aus Zugriff auf ein Objekt haben möchte. Das Singleton Pattern dient dazu um jeden Preis sicherzustellen dass der jeweilige
Typ unter allen Umständen und überhaupt exakt nur ein einziges Mal instanziert werden
kann. Das, und
nur das ist der Zweck des Singleton Pattern (so macht dann plötzlich auch der Name Sinn). Leider verstehen aber die meisten Singleton als die OOP Variante einer globalen Variable. Und da globale Variablen alles so schön einfach machen verwendet alle Welt globale Variablen getarnt als Singletons. Das ist aber eben genau
nicht der Sinn von Singleton. Globale Variablen werden nicht plötzlich zu gutem Stil nur weil eine bunte Verpackung drumherum ist. Die Tatsache dass es einen globalen Zugriffspunkt auf den Singleton gibt ist lediglich eine Konsequenz und nicht der eigentliche Zweck des Singleton Pattern.
Ich hab sicher schon tausende Singletons gesehn. Und jedes einzelne davon war ein Designfehler. Die tatsächlichen Anwendungsfälle für Singleton sind extrem rar. Auch wenn man sehr oft erstmal einfach nur ein Objekt eines Typs hat, wie oft hat man wirklich das Problem dass man sicherstellen muss dass bis in alle Ewigkeit auf keinen Fall mehr als nur eine einzige Instanz einer Klasse erzeugt werden kann? Richtig: Nie. Aber genau das würde man mit einem Singleton ausdrücken. Ich kenn vielleicht das ein oder andere rein hypothetische Szenario wo ein Singleton
unter anderem gerechtfertigt sein
könnte. In der Praxis ist mir aber noch nie eine Situation untergekommen in der ich einen Singelton für sinnvoll gehalten hätte, im Gegenteil, auch ich war schon ein- oder zweimal versucht der Einfachheit halber ein Singleton zu verwenden. Und ich war noch in jedem einzelnen dieser Fälle froh mich dagegen entschieden zu haben da es sich später als grobes Designproblem herausgestellt hätte.