Mythos über Fabrikmuster [geschlossen]

8

Das hat mich eine Weile gestört, und ich habe keine Hinweise, ob das ein Mythos ist.

Es scheint so zu sein, dass ein Factory-Muster den Schmerz beim Hinzufügen einer Abhängigkeit für eine Klasse lindern kann.

Zum Beispiel hat es in einem Buch so etwas wie

  

Angenommen, Sie haben eine Klasse namens Order. Anfangs war es von nichts abhängig. Deshalb haben Sie sich nicht die Mühe gemacht, eine Factory zu verwenden, um Order-Objekte zu erstellen, und Sie haben einfach nur Neu verwendet, um die Objekte zu instanziieren. Sie haben jetzt jedoch eine Anforderung, dass der Auftrag in Verbindung mit einem Kunden erstellt werden muss. Es gibt Millionen Stellen, die Sie ändern müssen, um diesen zusätzlichen Parameter hinzuzufügen. Wenn Sie nur eine Fabrik für die Ordensklasse definiert hätten, hätten Sie die neue Anforderung ohne den gleichen Schmerz erfüllt.

Wie ist das nicht der gleiche Schmerz wie das Hinzufügen eines zusätzlichen Parameters zum Konstruktor? Ich meine, du würdest immer noch ein zusätzliches Argument für die Fabrik geben müssen, und das wird auch von Millionen Orten benutzt, oder?

    
leiz 23.04.2010, 09:49
quelle

5 Antworten

5

Wenn der Benutzer nur zu der Zeit bekannt ist, zu der der Auftrag erstellt wurde, können Sie eine getCurrentUser() -Funktion implementieren, die von der Factory aufgerufen wird.
Wenn das möglich ist, gewinnt offensichtlich die Fabrikfunktion. Wenn nicht, dann gibt es keinen Gewinn.

Wenn Sie in der Vergangenheit nicht gewusst haben, dass ein Kunde benötigt wird, wissen Sie wahrscheinlich auch nicht, ob es möglich ist, eine getCurrentUser() -Funktion zu implementieren. Die Chancen, dass sich die Fabrikmethode auszahlt, sind möglicherweise nicht sehr gut, aber sie sind nicht immer gleich 0.

    
foraidt 23.04.2010, 10:16
quelle
3

Der wahre Vorteil einer Factory besteht darin, dass sie eine Fassade ist, die genau verbirgt, wie Sie ein Objekt erstellen, das die Order-Rolle erfüllt. Genauer gesagt weiß die Factory, dass du wirklich einen FooBarOrder erstellst, und nichts anderes muss geändert werden, um von einem FooBarOrder zu einem BarFooOrder zu wechseln. (Wenn Java es erlaubt, new abzufangen und stattdessen eine Unterklasse zu erstellen, gäbe es keine Fabriken. Aber es ist nicht - ziemlich vernünftig, fair zu sein -, also müssen Sie sie haben. Objektsysteme, die es ermöglichen, die Klasse zu untergliedern Klassen sind in dieser Hinsicht flexibler.)

    
Donal Fellows 23.04.2010 10:03
quelle
2

Nein, weil die Abhängigkeit für die Factory über den Factory-Konstruktor eingegeben werden soll. Sie erstellen die Factory nur an einem Ort, aber übergeben sie als die Abhängigkeit an alles, was zur Erstellung eines Auftrags benötigt wird. Die Dinge, die Befehle von der Fabrik erhalten, rufen immer noch dieselbe Methode, CreateOrder () oder was auch immer, auf, so dass der Code unverändert ist.

Die Abhängigkeiten sollten alle an einem Ort verdrahtet sein, die Kompositionswurzel , und das sollte der einzige Ort sein, der geändert werden muss, um die neue Abhängigkeit zur Factory hinzuzufügen

    
Sam Holder 23.04.2010 09:52
quelle
1

Sie erzählen der Fabrik von der neuen Abhängigkeit und lassen Sie sie für Sie hinzufügen. Der Methodenaufruf an die Fabrik sollte unverändert bleiben.

    
David M 23.04.2010 09:52
quelle
1

Das Fabrikmuster kann den Schmerz beim Hinzufügen einer Abhängigkeit lindern, weil es sich um eine Fabrik handelt contain state und kann tatsächlich mehrere Abhängigkeiten kapseln (z. B. anstatt drei Abhängigkeiten bereitzustellen, die alle zum Aufrufen des Konstruktors eines Objekts benötigt werden), stellen Sie jetzt nur ein einzelnes Factory-Objekt bereit, wobei die Factory diese drei benötigten Objekte enthält dem Konstruktor zur Verfügung gestellt werden).

Um ein Beispiel zu geben, vergleiche:

%Vor%

Und:

%Vor%

Beachten Sie, dass die zweite Version weniger Abhängigkeiten zur Methode "DoIt" benötigt. Dies bedeutet nicht, dass diese Abhängigkeiten nicht im gesamten Programm benötigt werden (tatsächlich verwendet das Programm weiterhin DependencyA und DependencyB in der Implementierung der Factory). Durch die Strukturierung dieser Abhängigkeit kann diese Abhängigkeit jedoch nur auf den Factory-Code isoliert werden, was anderen Code einfacher macht und es einfacher macht, die Abhängigkeiten von DependencyC zu ändern (jetzt muss nur die Factory selbst aktualisiert werden) Jeder Ort, der DependencyC instanziiert, und kann sogar bestimmte Sicherheitsvorteile haben (z. B. wenn DependencyA und DependencyB sensibel sind, wie Datenbankkennwörter oder API-Schlüssel), verringert die Verwendung der Fabrik die Wahrscheinlichkeit falscher Handhabung. im Vergleich zu Fällen, in denen Sie diese überall hin weitergeben, wo Sie beispielsweise die Datenbank oder die API verwenden müssen.)

In dem Beispiel, das in dem Buch gegeben wurde, wäre der Grund, warum eine Fabrik für die Order geholfen hätte, darin zu sehen, dass es die Anzahl der Stellen verringert hätte, an denen der Konstruktor direkt verwendet wird; nur der eine Ort, der die Fabrik geschaffen hat, müsste modifiziert werden, um Customer als zusätzliches Feld der Fabrik zu speichern; Keine der anderen Nutzungen der Fabrik müsste geändert werden. Im Vergleich dazu gibt es direkte Verwendung des Konstruktors ohne die Verwendung der Factory, und jeder von ihnen muss aktualisiert werden, um irgendwie Zugriff auf das Customer -Objekt zu erhalten.

    
Michael Aaron Safyan 23.04.2010 09:53
quelle

Tags und Links