Was ist los mit Singleton?
Singletons: gutes Design oder eine Krücke?
Singleton: Wie sollte es verwendet werden
Was ist so schlimm an Singletons
Sie können zahlreiche Gründe für die Verwendung eines Singleton über eine statische Klasse finden. Aber es gibt sicherlich Situationen, in denen es besser ist, vor einem Singleton eine statische Klasse zu verwenden. Was sind sie?
Sie können die statische Klasse verwenden, wenn:
1) all seine Methoden sind Dienstprogramme (schönes Beispiel - Klasse Math)
2) Sie möchten nicht, dass Ihre Instanz vom Garbage Collector (in Applets) erhalten wird, aber ich würde besser singleton dort verwenden
3) Sie sind absolut sicher, dass es in Zukunft nicht statusfähig wird und Sie sicher sind, dass Sie immer nur eine Instanz dieser Klasse benötigen
Wenn Sie Singleton verwenden und in einem Moment feststellen, dass Sie mehrere Instanzen benötigen, kann Ihr Singleton leicht in Multitone umgewandelt werden, aber Sie haben ein Problem mit der statischen Klasse
Nachdem ich im Laufe der Jahre mit der Testbarkeit der Konsumenten von statischen Klassen gekämpft habe, kann ich ehrlich sagen, dass sie die Arbeit böser Geister sind. Im Ernst, ich würde statische Klassen für Erweiterungsmethoden in C # verwenden, aber nicht wirklich woanders.
Wenn Ihre Klasse keinen Zustand speichert, verwenden Sie eine statische Klasse.
Wenn der Status gespeichert wird und Sie eine einzelne Instanz benötigen, verwenden Sie (möglicherweise) ein Singleton.
Ansonsten verwenden Sie eine reguläre Klasse.
Ein Singleton ist eine Klasse, von der nur eine Instanz instanziiert werden kann, während einer statischen Methode keine Instanz zugeordnet ist.
Wenn Sie die gewünschte Funktion mit einer einzigen statischen Methode implementieren können, ist dies wahrscheinlich Ihre beste Methode, da sie einfacher zu implementieren ist. Ziehen Sie Erweiterungsmethoden in Betracht - sie sind nur statische Methoden mit syntaktischem Zucker. Wenn Sie die statische Methode als Helper für eine vorhandene Klasse logisch anzeigen können, ist es sinnvoll, eine statische Methode zu verwenden.
Wenn es andererseits eine Art von Zustand in der Funktionalität gibt, die Sie erreichen möchten, ist es wahrscheinlich am besten, stattdessen einen Singleton zu verwenden. Das Singleton-Objekt kann seinen Status enthalten / verwalten und den gleichzeitigen Zugriff / Threading verwalten, während dies bei statischen Klassen und statischen Methoden viel komplizierter wird. Wenn Sie Singleton in C # verwenden, empfehle ich Ihnen, Jon Skeets Artikel über die richtige Singleton-Implementierung zu lesen, die unter Ссылка
Singletons sind eher mit statischen Klassen als mit statischen Methoden vergleichbar. Ein großer Vorteil, den Singletons in diesem Vergleich haben, ist, dass sie Schnittstellen implementieren und von Basisklassen ableiten können. Dies ermöglicht Ihnen, ihre Implementierungen von ihren Schnittstellen zu entkoppeln. Wenn ich zum Beispiel eine Schnittstelle IAccountService
in meiner Kernbaugruppe mit einer Singleton-Implementierung, SingletonAspNetAccountService
in meiner Serviceschicht habe, kann ich die IAccountService
in meine UI-Schicht mit einem IoC-Container injizieren, ohne dass eine Abhängigkeit davon erforderlich ist meine Serviceschicht in der UI-Ebene. Auf der anderen Seite, wenn ich eine statische Accounts
-Klasse hätte, müsste ich entweder einen Adapter zu den Methoden der statischen Klasse erstellen oder eine Abhängigkeit von der Service-Schicht in meiner UI haben, um auf die statische Kontofunktion zugreifen zu können / p>
Es ist immer dort, wo Sie die Singleton-Instanz nicht irgendwo hinführen müssen. Zum Beispiel ist Singleton nützlich, wenn es eine Schnittstelle implementiert, Sie können es nicht mit einer statischen Klasse tun.
Denken Sie daran, dass jede Klasseninstanz ein Singleton ist, der von JVM verwaltet wird. Also statische Klasse ist ein Singleton.