Erstens sollten eine Klasse und ihre Mitarbeiter in erster Linie ihren beabsichtigten Zweck erfüllen, anstatt sich auf die Abhängigen zu konzentrieren. Die Verwaltung des Lebenszyklus (wann Instanzen erstellt werden und wann sie aus dem Geltungsbereich herausfallen) sollte nicht in die Verantwortung der Klasse fallen. Die anerkannte Best Practice hierfür ist die Entwicklung oder Konfiguration einer neuen Komponente zur Verwaltung von Abhängigkeiten mittels Dependency Injection.
Oft wird Software komplizierter und es ist sinnvoll, mehrere unabhängige Instanzen der Singleton-Klasse mit unterschiedlichen Zuständen zu haben. In solchen Fällen ist es falsch, Code zu schreiben, um einfach das Singleton zu übernehmen. verwenden Singleton.getInstance()
mag für kleine, einfache Systeme in Ordnung sein, aber es funktioniert nicht, wenn man eine andere Instanz der gleichen Klasse benötigt.
Keine Klasse sollte als Singleton betrachtet werden, sondern es sollte eine Anwendung sein, die sich auf ihre Verwendung bezieht oder auf die Art und Weise, wie sie verwendet wird, um Abhängigkeiten zu konfigurieren. Für ein schnelles und einfaches Programmieren spielt dies keine Rolle - z.B. spielen Dateipfade keine Rolle, aber für größere Anwendungen müssen solche Abhängigkeiten ausgeklammert und auf angemessenere Weise mit DI verwaltet werden.
Die Probleme, die Singleton beim Testen verursachen, sind ein Symptom ihrer hart kodierten Einzelverwendung/Umgebung. Die Testsuite und die vielen Tests sind jeweils individuell und separat, was mit der harten Kodierung eines Singletons nicht vereinbar ist.