Frage

Oder ist es besser, ein anderes Design, Muster zu benutzen?

War es hilfreich?

Lösung

auf eine ähnliche Frage geantwortet vor einigen Tagen hier spöttisch ein Singleton . Der ursprüngliche Beitrag ist für C # .Net hinsichtlich eines Singletons Verhalten spöttisch, sollte aber nach wie vor gelten.

Wie die Singletonmuster betrifft, so gibt es nichts falsch mit ihm per se - in vielen Fällen wir Logik und Daten zentralisieren wollen. Allerdings gibt es einen sehr großen Unterschied zwischen einem Singleton und einer statischen Klasse. Bauen Sie Ihre Singletons als statische Klasse hart Codes, dass die Umsetzung für jeden Verbraucher in Ihrer Anwendung - was sehr schwierig Unit-Tests macht

Was möchten Sie tun ist eine Schnittstelle für Ihre Singleton zu definieren, die Methoden für die Verbraucher Aussetzen zu verwenden. Ihre Kunden wiederum sind übergeben ein Verweis auf eine implementierende Klasse von wem auch immer sie instanziiert [Regel ist dies Ihre Anwendung oder ein Container, wenn Sie mit Dependency Injection \ Inversion of Control vertraut sind].

Es ist dieser Rahmen, wer auch immer die Verbraucher wird instanziiert wird, die für die Gewährleistung einer und nur einer Instanz im Umlauf verantwortlich ist. Es ist wirklich nicht so groß ein Sprung von den statischen Klasse Bezug auf Interface [wie in Verbindung oben gezeigt], die Sie gerade den Komfort einer global zugänglichen Instanz verlieren - ich weiß, ich weiß, globale Referenzen schrecklich verführerisch, aber Luke drehte ihm den Rücken zu dem Dark Side, so können Sie!

Im Allgemeinen Best Practices empfehlen die Vermeidung statischer Referenzen und ermutigt Programme gegen Schnittstellen. Denken Sie daran, es noch möglich ist, die Singletonmuster mit diesen Einschränkungen gelten. Befolgen Sie diese Richtlinien, und Sie sollten kein Problem Einheit Testen Sie Ihre Arbeit haben:)

Hope, das hilft!


Singleton! = Public static Klasse , sondern Singleton == einzelne Instanz

Andere Tipps

Der Mangel an Testbarkeit ist einer der wichtigsten Übertretungen der klassischen Singleton-Modell (statischen Klassenmethode Rückkehr eine Instanz). Soweit es mich betrifft, ist, dass die Rechtfertigung genug, um Re-Design jeder Code, der Singletons zu verwenden, um einige andere Design verwendet.

Wenn Sie unbedingt eine einzigartige Instanz muß, dann Dependency Injection und das Schreiben an eine Schnittstelle, wie von johnny g vorgeschlagen, ist definitiv der Weg zu gehen.

Ich bin mit dem folgenden Muster , wenn ich eine statische-basierte Singletons schreiben, die ich spotten kann. Der Code ist Java, aber ich denke, Sie werden eine Vorstellung bekommen. Das Hauptproblem bei diesem Ansatz ist, dass Sie Konstruktor Paket-geschützt entspannen (was sorta eine wahre Singleton besiegt). Als Randbemerkung - gilt der Code Fähigkeit einfach Ihren „statischen“ Code zu verspotten nicht unbedingt nennt es

ich nur allgemein Singletons verwenden für Flyweight Objekte oder ähnliche Wertobjekte. Blick in einen IoC-Container (wie oben erörtert) ist wahrscheinlich eine bessere Möglichkeit, ein gemeinsames Objekt als ein Singleton zu behandeln.

Beachten Sie, dass in Smalltalk (wo viele dieser Muster entstanden), wahr und falsch waren effektiv beide Singletons:)

Wenn Sie ein Singleton verwenden müssen (und es gibt Gründe, dies zu tun ... aber ich würde immer versuchen, es zu vermeiden, wenn möglich). Ich würde empfehlen, einen IOC-Container mit ihm zu verwalten. Ich bin nicht sicher, ob es eine für Delphi ist oder nicht. Aber in Java könnten Sie Frühling verwenden, in .NET Sie Windsor / Burg verwenden können. Ein IOC Behälter kann auf die Singleton halten und verschiedene Implementierungen für den Test registrieren.

Es ist wahrscheinlich zu groß ein Subjekt in hier über diesen Schnipsel zu erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top