Richtiges Verwenden des Singleton-Entwurfsmusters

8

Ich betreibe einen Server, der gelegentlich suchen muss, was ein Client abfragt. Ich möchte die Client-Abfrage für Datensätze auf die Festplatte schreiben, aber ich möchte die Suche nicht mehr verlangsamen als nötig. (Die Suche ist bereits der Flaschenhals ...)

Wenn also der Client eine Suche durchführt, wird der Thread des Clients eine Nachricht an einen Singleton-Thread senden, der das Schreiben auf der Festplatte übernimmt, während der Client-Thread weiterhin die Anforderungen des Clients verarbeitet. Auf diese Weise führt die Datei auf dem Datenträger nicht zu Synchronisierungsproblemen und verlangsamt das Client-Erlebnis nicht.

Ich habe hier eine konzeptionelle Frage: Ist der Singleton in diesem Fall geeignet? Ich habe das Singleton-Entwurfsmuster in meinen letzten Programmierarbeiten ein wenig zu viel verwendet und möchte sicherstellen, dass ich es für den beabsichtigten Zweck verwende.

Jede Rückmeldung wird sehr geschätzt.

    
Sal 02.01.2012, 23:05
quelle

1 Antwort

7

Das Singleton-Muster ist definitiv überstrapaziert und kommt mit seinem Anteil von Difficultyies (Unit-Testing ist das kanonische Beispiel), aber wie alles im Design, müssen Sie die Vor- und Nachteile für Ihr spezifisches Szenario abwägen. Das Singleton-Muster hat seine Verwendung. Es gibt Optionen, mit denen Sie das Singleton-Verhalten erhalten und gleichzeitig einige der inhärenten Probleme beheben können:

Interception (oft als aspektorientierte Programmierung bezeichnet, obwohl ich Debatten gesehen habe sie sind nicht genau dasselbe ... ich finde den Artikel, den ich zu diesem Zeitpunkt gelesen habe, nicht, ist definitiv eine Option. Sie können eine beliebige Kombination von Konstruktions-Injektion, Dekorateur Muster, eine abstrakte Fabrik und ein Inversion des Kontrollcontainers . Ich bin nicht auf meinen Java-IoC-Containern, aber es gibt einige .Net-Container, die ein automatisches Interception erlauben (ich glaube, dass Spring.Net dies tut, so wahrscheinlich Spring (Java) hat dies eingebaut). Dies ist sehr praktisch für alle Arten von bereichsübergreifenden Problemen, bei denen bestimmte Aktionen über mehrere Ebenen hinweg ausgeführt werden müssen (Sicherheit, Protokollierung usw.). Außerdem können Sie mit den meisten IoC-Containern die Lebensdauerverwaltung steuern, sodass Sie Ihren Logger als Singleton behandeln können, ohne das Singleton-Muster manuell implementieren zu müssen.

Um es zusammenzufassen. Wenn ein Singleton für Ihr Szenario passt (scheint plausibel aus Ihrer Beschreibung), gehen Sie dafür. Stellen Sie nur sicher, dass Sie die Vor- und Nachteile abgewogen haben. Vielleicht möchten Sie einen anderen Ansatz ausprobieren und die beiden vergleichen.

    
Jason Down 03.01.2012, 02:00
quelle