5 Stimmen

Unter welchen Umständen sollte ich eine Singleton-Klasse verwenden?

Geschlossen als exaktes Duplikat von diese Frage . Aber wieder geöffnet, da die anderen Singleton Fragen sind für den allgemeinen Gebrauch und nicht für DB-Zugriff verwenden

Ich habe darüber nachgedacht, eine interne Datenzugriffsklasse zu einem Singleton zu machen, konnte mich aber nicht davon überzeugen, vor allem weil die Klasse außer den lokalen Variablen in ihren Methoden keinen Status hat.

Welchen Sinn hat es schließlich, solche Klassen als Singletons zu konzipieren?
Gewährleistet sie einen sequentiellen Zugriff auf die Datenbank, was nicht überzeugend ist, da die meisten modernen Datenbanken die Gleichzeitigkeit gut handhaben können?
Ist es die Möglichkeit, eine einzige Verbindung wiederholt zu verwenden, die durch das Pooling von Verbindungen behoben werden könnte? Oder ist es die Einsparung von Speicherplatz durch die Ausführung einer einzigen Instanz?

Bitte klären Sie mich diesbezüglich auf.

1voto

Rene Punkte 4002

Das Singleton ist ein nützliches Entwurfsmuster, um nur eine Instanz Ihrer Klasse zuzulassen. Der Zweck des Singletons ist es, die Erstellung von Objekten zu kontrollieren und die Anzahl auf ein Objekt zu beschränken, aber die Flexibilität zu haben, mehr Objekte zu erstellen, wenn sich die Situation ändert. Da es nur eine Singleton-Instanz gibt, kommen alle Instanzfelder eines Singletons nur einmal pro Klasse vor, genau wie statische Felder.

Quelle: java.sun.com

1voto

Dustin Getz Punkte 20462
  1. Die Verwendung eines Singletons bringt Ihnen hier nicht wirklich etwas, aber begrenzt die Flexibilität
  2. Sie WOLLEN Gleichzeitigkeit oder Sie werden nicht skalieren
  3. über Verbindungen und Speicher zu machen, ist hier ein vorzeitige Optimierung

1voto

Limbic System Punkte 6550

Das Singleton-Muster hat in den letzten Jahren viel von seinem Glanz eingebüßt, vor allem wegen der Zunahme von Unit-Tests.

Singletons können Unit-Tests sehr schwierig machen - wenn Sie immer nur eine Instanz erstellen können, wie können Sie dann Tests schreiben, die "frische" Instanzen des zu testenden Objekts erfordern? Wenn ein Test das Singleton in irgendeiner Weise verändert, beginnen alle weiteren Tests für dasselbe Objekt nicht wirklich mit einem Neuanfang.

Singletons sind auch problematisch, weil sie effektiv globale Variablen sind. Vor ein paar Wochen hatten wir in meinem Büro ein Threading-Problem, das auf ein globales Singleton zurückzuführen war, das von verschiedenen Threads aus geändert wurde; der Entwickler war durch die Verwendung eines genehmigten "Musters" geblendet und erkannte nicht, dass er in Wirklichkeit eine globale Variable erstellt hatte.

Ein weiteres Problem ist, dass es in bestimmten Situationen pathologisch schwierig sein kann, echte Singletons zu erzeugen. In Java zum Beispiel ist es möglich, mehrere Instanzen Ihres "Singletons" zu erzeugen, wenn Sie die Funktion "Singleton" nicht richtig implementieren. readResolve() Methode für serialisierbare Klassen.

Anstatt ein Singleton zu erstellen, sollten Sie eine statische Factory-Methode bereitstellen, die eine Instanz zurückgibt; so haben Sie zumindest die Möglichkeit, Ihre Meinung zu ändern, ohne Ihre API zu zerstören.

Josh Bloch hat eine gute Diskussion zu diesem Thema in Leistungsfähiges Java .

1voto

Chris Brandsma Punkte 11525

Sie haben eine Repository-Ebene, die nur einmal erstellt werden soll und deren Referenz überall sonst verwendet wird.

Wenn Sie mit einem Standard-Singleton gehen, gibt es einen schlechten Nebeneffekt. Sie töten im Grunde die Testbarkeit. Der gesamte Code ist eng an die Singleton-Instanz gekoppelt. Jetzt können Sie keinen Code mehr testen, ohne auf die Datenbank zuzugreifen (was Unit-Tests erheblich erschwert).

Mein Rat:

  1. Finden Sie ein IOC, das Ihnen gefällt, und integrieren Sie es in Ihre Anwendung (StructureMap, Unity, Spring.Net, Castle Windsor, Autofac, Ninject...suchen Sie sich eines aus).
  2. Implementieren Sie eine Schnittstelle für Ihr Repository.
  3. Sagen Sie dem IOC, dass es das Repository als Singleton behandeln und zurückgeben soll, wenn der Code über die Schnittstelle nach dem Repository fragt.
  4. Erfahren Sie mehr über Dependency Injection.

Das ist eine Menge Arbeit für eine einfache Frage. Aber Sie werden besser dran sein.

1voto

Charlie Martin Punkte 106684

Wenn eine Klasse keine Alle vernünftigen Sprachen erzeugen höchstens einen einzigen Zeiger auf die Vektortabelle (oder eine gleichwertige Struktur), um die Methoden zu versenden.

Wenn es einen Instanzzustand gibt, der zwischen den Instanzen der Klasse variieren kann, dann funktioniert ein Singleton-Muster nicht; Sie brauchen mehr als eine Instanz.

Daraus folgt, dass Singleton nur dann verwendet werden sollte, wenn es einen Zustand gibt, der von allen Zugriffsberechtigten geteilt werden muss, und nur einen Zustand, der von allen Zugriffsberechtigten geteilt werden muss.

Es gibt mehrere Faktoren, die zu einer Art Singleton führen können:

  • das Factory-Muster: Sie konstruieren und geben ein Objekt zurück, das einen gemeinsamen Zustand.
  • Ressourcenpools: Sie haben eine gemeinsame Tabelle mit einigen begrenzten Ressourcen, wie Datenbankverbindungen, die Sie einer großen Gruppe von Benutzern verwalten Benutzern verwalten müssen. (Die Bumpo-Version ist, wenn vorhanden ist eine DB-Verbindung, die von ein Singleton).
  • Gleichzeitigkeitskontrolle eines externen Ressource; eine Semaphore ist im Allgemeinen eine Variante von Singleton sein, denn P/V-Operationen müssen einen gemeinsamen Zähler atomar verändern müssen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X