2009-09-15 15 views
7

Ich frage mich, ob es ein gegensätzliches Muster des Fabrikmusters gibt. Wenn zum Beispiel ein bestimmtes Objekt gelöscht werden muss, müssen einige zusätzliche Arbeiten ausgeführt werden, um die Konfiguration rückgängig zu machen, die im Factory-Objekt ausgeführt wurde.Welches Designmuster ist das Gegenteil des Factory-Musters?

Die Erweiterung des Factory-Objekts mit einer Delete-Methode zum Beispiel scheint falsch, da das Factory-Muster ein strenges Creational-Muster ist.

Update: Der Grund, warum ich eine Fabrik verwende, ist, weil die Konfiguration, die getan werden muss, einige Abhängigkeiten zum Objekt einführen würde, die nicht passen würden. Diese De-Konfiguration in den Konstruktor zu setzen, würde das gleiche Problem darstellen.

+2

Was genau meinen Sie mit "Löschen"? Freigeben aus dem Speicher oder Entfernen aus einem Datenspeicher? –

+0

Mit dem Löschen meinte ich, es aus einem Datenspeicher zu entfernen, dies würde vom Repository erledigt werden. –

+0

und welche Art von "Konfiguration wurde im Fabrikobjekt durchgeführt"? Ein Objekt sollte in der Lage sein, nach sich selbst die Aufgabe des Destruktors zu beseitigen und/oder zu entsorgen. Ich würde behaupten, dass eine Fabrik nichts von den Objekten wissen sollte, die sie geschaffen hat. –

Antwort

3

Das ist der richtige Weg, Fabrik zu verwenden. Factory ist nicht nur eine Möglichkeit, Objekte zu erstellen, sondern auch die Art zu sagen: Ich brauche eine spezielle Initialisierung für diese Art von Objekten. Mit Ihrem Problem, denke ich, wäre die beste Lösung, Fabrik mit einem Ereignis, wie entsorgt, zu benachrichtigen. So wird Ihre Objekterstellung auf folgende Art und Weise durchgeführt: create, subscribe factory to event des neu erstellten Objekts. Jedes Mal, wenn ein Objekt gelöscht wird, benachrichtigen Sie das Werk und führen die erforderliche Aktion aus.

Wenn Sie nicht möchten, dass dies in die Fabrik gebracht wird, können Sie es an ein anderes Objekt delegieren, wie DeathKeeper ;-). So Ihr Code wie folgt aussehen sometihng:

//Inside factory create method 
MyObject obj = GetNewInitializedObject(); 
_detahKeeper.RegisterObject(obj); 

return obj; 

Nun jedes Mal, müssen Sie Objekt löschen, Ihr Objekt wird den Tod Keeper benachrichtigen und es würde alle dispose Logik machen. Übrigens, ich weiß nicht, wie alles funktioniert, aber Sie können IDisposable-Schnittstelle verwenden, um die benutzerdefinierte Logik für die Entsorgung von Ressourcen, die von Objekt gehalten werden, auszuführen. Die Entscheidung hängt davon ab, was in Ihrem Projekt vorhanden ist und liegt bei Ihnen.

4

Ein Repository könnte verwendet werden, um ein persistentes Objekt zu löschen, oder Sie könnten die displace-Methode verwenden, um eine Bereinigung für ein in-Memory-Objekt durchzuführen.

+0

Ich werde diese "De-Konfiguration" für jetzt in das Repository legen. –

+0

Müssen Sie alle persistenten (Datenbank/Datei) Informationen zerstören? –

2

Ich verwende ein „Recyclinganlage“ Muster im Tandem mit der Fabrik arbeiten:

  • haben eine „saubere“ Methode für jede Klasse, die
  • haben eine „eindeutige ID“ für jedes Objekt zurückgeführt werden kann Beispiel

Jedes Mal, wenn ein Objekt seine End-of-Lebensdauer erreicht hat, um es in die "Recyclinganlage" (RF) senden:

  • Der RF speichert das Objekt gemäß einer bestimmten Richtlinie (z. nur X Instanzen der Klasse Y halten)
  • Wenn eine eine Instanz der Klasse Y benötigt wird, die Fabrik „fragt“ die RF, wenn seine ein
    • bekam, wenn der RF eine handliche hat, ruft der RF die „sauber()“Verfahren für die Instanz und gibt sie an die Fabrik

... und so weiter so weiter.

Hoffe, das hilft.