2012-04-12 6 views
1

Ich schreibe ein Programm, wo ich unter vielen anderen Dingen drei Klassen brauche, die wir Schriftsteller, Speicher und Leser nennen können.Kann und muss ich Singleton-Muster vermeiden?

Writer muss auf die Speicherklasse sehr oft zugreifen, während Leser stattdessen etwas selten besonders im Vergleich zu Writer. Die Speicherklasse dient nur dazu, die Schreibvorgänge des Datenschreibers zu speichern. Das einzige, was der Autor macht, ist, einige kurze Datenstöße zu schreiben. Der Leser liest die geschriebenen Daten aus dem Speicher und leert dann den Speicher, um Speicherplatz freizugeben, damit der Schreiber neue Daten schreiben kann. Um einige Zahlen und eine Vorstellung von der Häufigkeit der Zugriffe zu geben, sagen wir, dass der Schreiber mehrmals in der Minute auf den Speicher zugreift und der Leser ungefähr einmal pro Stunde darauf zugreift.

Die Frage ist also, ob ich das Singleton-Muster in der Storage-Klasse verwenden muss oder reicht es aus, es als statische Klasse zu deklarieren?

Auch wie kann ich sicherstellen, dass, wenn die Reader-Klasse den Speicher verwendet, es die Speicherressource sofort freigibt, nachdem es die Daten aus dem Speicher gelesen und geleert hat? Die meiste Zeit sollte die Speicherklasse für den Schreiber verfügbar sein, um die Daten darin zu schreiben.

Die Singleton Ansatz sieht gut aus, vor allem, dass ich nicht von OOP Hintergrund bin. Ich habe gehört, dass es schlecht ist.

+1

Und für mich klingt es mehr wie Gleichzeitigkeit und Synchronisationsproblem. Außerdem ist die richtige Verwendung von Konstruktoren zum Erstellen der Objekte die erste Wahl. – nobeh

+0

Nein, es ist keine Hausaufgabe. Ich stimme zu, dass dies auch ein Nebenläufigkeits- und Synchronisationsproblem ist, obwohl es nur diesen seltenen Moment gibt, in dem ich sicherstellen muss, dass Schreiber und Leser nicht gleichzeitig auf den Speicher zugreifen. Deshalb möchte ich auch sicherstellen, dass der Leser so schnell wie möglich ausführt. Beachten Sie, dass der Leser diese Löschoperation ausführen muss, die tatsächlich schreibt (es sei denn, es gibt eine Möglichkeit, ohne zu schreiben zu spülen). – zaplec

+0

Ich schlage vor, einen Blick auf verschiedene Optionen unter [java.util.concurrent.locks] (http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/locks/package-summary) zu werfen. html) – nobeh

Antwort

0

Grundsätzlich ist Singleton so ziemlich wie eine statische Klasse. Beide sind schlecht und gut unter gleichen Umständen, aber Singleton ist eher "objektorientiert". In einer prototypbasierten Sprache gibt es keinen wirklichen Unterschied.

Singletons bekommen einen schlechten Ruf, weil viele Leute sie als Ersatz für globale Variablen verwenden (die jetzt jeder "weiß" ist schlecht). Auf diese Weise sind Singletons ebenso schlecht wie globale Variablen. Benutze ein Singleton, wenn es wirklich ein Objekt modelliert, von dem du sicher bist, dass es nur eine Instanz hat. Wenn es auch theoretisch eine andere Instanz in einer Zukunft haben könnte, oder wenn es nicht etwas Bestimmtes modelliert, sollte das Singleton-Muster nicht verwendet werden - noch sollte eine statische Klasse.

All dies hat nichts mit Ihrem Leser/Schreiber-Problem zu tun; Einer ist, wie die Kommentare zeigen, ein Erzeuger-/Verbrauchermuster oder ein Beobachtermuster (abhängig davon, wie Sie es implementieren). Die andere ist das grundlegende objektorientierte Design-Problem.

+0

Die Storage-Klasse wird etwas als eine riesige globale Variable verwendet. Die Reader-Klasse benötigt ziemlich viel Speicher und wird etwa einmal in einer Stunde verwendet, so dass es nicht möglich ist, direkt darin zu schreiben. Dann gibt es einige Fälle, in denen die Writer-Klasse zerstört oder gestoppt wird, aber die Daten sollten verfügbar sein, wann immer der Leser es benötigt, deshalb dachte ich, dass Daten in einer eigenen Klasse geschrieben werden sollten, solange das Programm läuft und Laufen. – zaplec

0

Muss ich das Singleton-Muster in der Speicherklasse verwenden oder ist es genug, um es als statische Klasse zu deklarieren?

Dies sind keine verwandten Fragen.
Singleton gibt an, wie viele Instanzen einer Klasse Sie haben sollen.
Mit Singleton erzwingen Sie nur 1 Instanz in Ihrem Programm.
Wenn das ist, was Sie brauchen, dann verwenden Sie ein Singleton.
Für den Rest sollten Sie über Hersteller/Verbraucher Muster lesen

2

Wie immer mit diesen Fragen, glaube ich nicht, gibt es eine einzige richtige Antwort.

Zuerst gibt es bereits a very good answer to that question.

Die typische Implementierung des Singleton-Musters beruht auf einem statischen Feld, das die einzige Instanz dieser Klasse enthält. Ich mag diesen Ansatz überhaupt nicht, weil das statische Feld im wesentlichen eine globale Variable mit all ihren Nachteilen ist (z.B.versteckte Abhängigkeiten und Risiko einer erhöhten Kopplung, die die Testbarkeit beeinträchtigen.

Aber die allgemeinere Idee eines Singleton in dem Sinne, dass Sie nur eine einzelne Instanz der Klasse in Ihrer Anwendung wollen, ist wahrscheinlich eine gute Idee in dem Szenario, das Sie beschreiben. Anstatt jedoch über eine statische Variable auf sie zuzugreifen, würde ich sie an den Konstruktor der Klasse übergeben, die sie benutzt. Auf diese Weise sind die Abhängigkeiten zwischen den Klassen offensichtlich und es wird das Testen vereinfachen (z. B. wenn Sie einen Schein anstelle der realen Klasse injizieren möchten). Sehen Sie hier für weitere Vorteile auf constructor injection.

Verwandte Themen