2016-03-31 8 views
0

Ich habe in meinem Projekt zwei Klassen für die Verwaltung von Speicher: MemoryStorage und MemoryFile.Ersetzen einer Singleton-Lösung für einen Speichermanager in C++

Die erste funktioniert ähnlich wie eine Festplatte und hält MemoryFiles (Dateien, Verzeichnisse, etc.) mit einem Singleton (hinzufügen, entfernen, frei, etc). Die zweite funktioniert wie fstream, aber für den Speicher (Öffnen, Schließen, Schreiben, Lesen, etc.).

Anwendungsbeispiel

MemoryFile file(&MemoryStorage); 
// Open file in write mode 
if (file.open("filename", open_mode::out)) { 
    // Data file 
    int* obj = new int; 
    *obj = 0; 
    // Write in internal buff 
    file.write(obj, sizeof(int)); 
    delete obj; 
    // Put buff in MemoryStorage and clear buff 
    file.close(); 
} 
// Other moment 
// Open file in read mode 
if (file.open("filename", open_mode::in)) { 
    // Data file 
    int* obj = new int; 
    // Write in internal buff 
    file.read(obj, sizeof(int)); 
    cout << *obj << endl; // Print: 0 
    delete obj; 
    // Put buff in MemoryStorage and clear buff 
    file.close(); 
} 

Wenn ich nicht mit einem Singleton, Dateien mit dem gleichen Namen im Speicher möglich sein wird erstellen, zu einem inkonsistenten Dateisystem führt.

Ich habe mehrere Artikel im Stapelüberlauf wie this one gelesen, die darüber sprechen, wie Singleton ist schlechtes Muster nach vielen Programmierern.

Wie kann ich das obige Programmierproblem ohne ein Singleton-Muster lösen? Benütze ich einen privaten statischen Member in MemoryStorage, der den Effekt eines Singleton repliziert?

+0

das Dateisystem * ist * ein Singleton –

Antwort

0

Unabhängig von Ihrem Anwendungsfall, wenn Sie absolut sicher sind, dass das Objekt, das Sie darstellen, nur eine Instanz in der realen Welt hat, wie der Memomy-Manager, ist die Verwendung von Singleton sicherlich eine sinnvolle Option.

Das Problem mit Singleton ist, dass es ist nicht so einfach Muster wie es aussieht. Um ein paar Fragen zu stellen, werden Sie sich stellen - Was ist mit Multithread-Umgebungen, können Sie absolut garantieren, dass nicht zwei Singletons erstellt werden? Und was ist mit der Zerstörung von Singletons? Was ist mit Erbschaft oder mehr Singletons?

Ich schlage vor, dass, wenn Sie glauben, Singleton ist ein Weg zu gehen, versuchen Sie es, aber beachten Sie alle Probleme, die Sie lösen müssen, bevor Sie die Implementierung starten.

+0

@peter Ich versuche Max Singleton Muster aus diesem Grund zu vermeiden, aber diesen Fall sehe ich keine andere Lösung. sehr nützliche Fragen, Thx. –

-1

YATAS! Noch ein weiterer Thread über Singletons. Singletons SOLLTEN NUR verwendet werden, wenn sie etwas darstellen, das natürlich nur für den von Ihnen ausgeführten Prozess in singulärer Form existiert. Wie FILESYSTEM, LOG, etc.

Gleichzeitig vermeiden Sie nicht Singletons, wenn Sie einen echten Fall für sie haben. HÖRT NICHT auf Puristen, sie schreiben kaum einen echten Code neben "Code Samples".

Verwandte Themen