Kann jemand den Unterschied zwischen Fabrik- und Strategiemustern erklären?
Für mich sehen beide gleich aus, abgesehen von einer zusätzlichen Fabrikklasse (die ein Produktobjekt in Fabrikmustern erzeugt).
Kann jemand den Unterschied zwischen Fabrik- und Strategiemustern erklären?
Für mich sehen beide gleich aus, abgesehen von einer zusätzlichen Fabrikklasse (die ein Produktobjekt in Fabrikmustern erzeugt).
Antworten:
Ein Fabrikmuster ist ein Kreationsmuster. Ein Strategiemuster ist ein operatives Muster. Anders ausgedrückt, ein Factory-Muster wird verwendet, um Objekte eines bestimmten Typs zu erstellen. Ein Strategiemuster wird verwendet, um eine Operation (oder einen Satz von Operationen) auf eine bestimmte Weise auszuführen. Im klassischen Beispiel kann eine Fabrik verschiedene Arten von Tieren erstellen: Hund, Katze, Tiger, während ein Strategiemuster bestimmte Aktionen ausführen würde, z. B. Verschieben; Verwenden von Run-, Walk- oder Lope-Strategien.
Tatsächlich können die beiden zusammen verwendet werden. Beispielsweise verfügen Sie möglicherweise über eine Factory, in der Ihre Geschäftsobjekte erstellt werden. Je nach Persistenzmedium können unterschiedliche Strategien verwendet werden. Wenn Ihre Daten lokal in XML gespeichert sind, wird eine Strategie verwendet. Wenn die Daten in einer anderen Datenbank entfernt wären, würde eine andere verwendet.
Mit dem Strategiemuster können Sie das Verhalten einer Klasse polymorph ändern.
Mit dem Factory-Muster können Sie die Objekterstellung kapseln.
Gary macht einen tollen Punkt. Wenn Sie das Prinzip der Codierung in Abstraktionen anstelle von "Konkretionen" verwenden, sehen viele Muster wie Variationen eines Themas aus.
Nur um das zu ergänzen, was tvanfosson gesagt hat, sehen viele Muster in Bezug auf die Implementierung gleich aus. Das heißt, Sie haben häufig eine Schnittstelle erstellt, an der möglicherweise noch keine in Ihrem Code vorhanden war, und dann eine Reihe von Implementierungen dieser Schnittstelle erstellt. Der Unterschied liegt in ihrem Zweck und in ihrer Verwendung.
Erstellen Sie nur konkrete Instanzen. Unterschiedliche Argumente können zu unterschiedlichen Objekten führen. Es kommt auf die Logik usw. an.
Kapselung des Algorithmus (Schritte), um eine Aktion auszuführen. Sie können also die Strategie ändern und einen anderen Algorithmus verwenden.
Während beide sehr ähnlich aussehen, ist der Zweck ziemlich unterschiedlich, ein Zweck ist das Erstellen des anderen, das Ausführen einer Aktion.
So. Wenn Ihre Factory-Methode festgelegt ist, haben Sie möglicherweise Folgendes:
public Command getCommand( int operatingSystem ) {
switch( operatingSystem ) {
case UNIX :
case LINUX : return new UnixCommand();
case WINDOWS : return new WindowsCommand();
case OSX : return new OSXCommand();
}
}
Angenommen, Ihre Fabrik muss weiterentwickelt oder dynamischer erstellt werden. Sie können der Factory-Methode eine Strategie hinzufügen und diese ändern, ohne sie neu kompilieren zu müssen. Die Strategie kann sich zur Laufzeit ändern.
Zunächst muss zwischen einfacher Fabrik und abstrakter Fabrik unterschieden werden. Die erste ist eine einfache Factory, in der Sie nur eine Klasse haben, die als Factory für die Objekterstellung fungiert. In letzterer stellen Sie eine Verbindung zu einer Factory-Schnittstelle her (die die Methodennamen definiert) und rufen dann die verschiedenen Fabriken auf, die diese Schnittstelle implementieren sollen basierend auf einigen Kriterien unterschiedliche Implementierungen derselben Methode haben. Zum Beispiel haben wir eine ButtonCreationFactory-Schnittstelle, die von zwei Fabriken implementiert wird, der ersten WindowsButtonCreationFactory (erstellt Schaltflächen mit Windows-Look & Feel) und der zweiten LinuxButtonCreationFactory (erstellt Schaltflächen mit Linux-Look & Feel). Beide Fabriken haben also dieselbe Erstellungsmethode mit unterschiedlichen Implementierungen (Algorithmen).
Zum Beispiel, wenn Sie Schaltflächen mit Linux-Look & Feel möchten:
ButtonCreationFactory myFactory = new LinuxButtonCreationFactory();
Button button1 = myFactory.createButton(...);
oder wenn Sie Windows-Schaltflächen möchten
ButtonCreationFactory myFactory = new WindowsButtonCreationFactory();
Button button1 = myFactory.createButton(...);
Genau in diesem Fall führt dies zu einer Art Strategiemuster, da es Algorithmen für die Erstellung unterscheidet. Es unterscheidet sich jedoch semantisch davon, da es eher für die OBJEKTERSTELLUNG als für Betriebsalgorithmen verwendet wird. Im Grunde genommen haben Sie mit der abstrakten Fabrik die Objekterstellung mit verschiedenen Strategien, was sie dem Strategiemuster sehr ähnlich macht. Die AbstractFactory ist jedoch kreativ, während das Strategiemuster betriebsbereit ist. In Bezug auf die Implementierung sind sie gleich.
Factory (und FactoryMethod, die von Factory zurückgegeben werden) :
Schauen Sie sich diesen Wikipedia-Artikel und den von Javarevisierten Artikel an
Strategiemuster:
Beispiel:
Sie können die Rabattstrategie für einen bestimmten Artikel (AirFare-Ticket oder ShoppingCart-Artikel) konfigurieren. In diesem Beispiel gewähren Sie von Juli bis Dezember 25% Rabatt auf einen Artikel und von Jaunary bis Juni keinen Rabatt auf den Artikel.
Zusammenhängende Posts:
Beispiel aus der Praxis für das Strategiemuster
Entwurfsmuster: Factory vs Factory-Methode vs Abstract Factory
Um zu erweitern, was Oscar gesagt hat und in Bezug auf seinen Code:
Der getCommand ist die Factory und die Klassen UnixCommand, WindowsCommand und OSXCommand sind Strategien
Strategiemuster in einfachen Worten ist eher die Erstellung von Verhaltensweisen zur Laufzeit, wenn Sie sich nicht mit der implementierenden Klasse befassen. Auf der anderen Seite hat Factory die Laufzeiterstellung einer konkreten Klasseninstanz und es liegt an Ihnen, jedes Verhalten (jede Methode) zu verwenden, das von der implementierten Schnittstelle verfügbar gemacht wird.
Sie können den Unterschied nicht einfach anhand des Codes oder der Kategorisierung verstehen. Um die GoF-Muster richtig zu erfassen, suchen Sie nach ihren Absichten:
Strategie: "Definieren Sie eine Familie von Algorithmen, kapseln Sie jeden einzelnen und machen Sie sie austauschbar. Mit der Strategie kann der Algorithmus unabhängig von den Clients variieren, die ihn verwenden."
Factory-Methode: "Definieren Sie eine Schnittstelle zum Erstellen eines Objekts, lassen Sie jedoch die Unterklassen entscheiden, welche Klasse instanziiert werden soll. Mit der Factory-Methode kann eine Klasse die Instanziierung auf Unterklassen verschieben."
Und hier ist eine ausführliche Erklärung der Absichten und Unterschiede zwischen diesen beiden Mustern: Unterschied zwischen Entwurfsmustern für Factory-Methoden und Strategien
Ich kann mit Oscar abschweifen, da sein Beispiel für eine Factory-Implementierung ziemlich eng gekoppelt und sehr geschlossen ist. Kein Wunder, dass Sie sich für ein Strategiemuster entscheiden. Eine Factory-Implementierung sollte nicht von einer festen Anzahl bestimmter Klassen abhängen, die instanziiert werden. Beispiel:
public Command getCommand( int operatingSystem ) {
return commandTable.get(operatingSystem);
}
...
public class WindowsCommand implements Command {
...
static {
CommandTable.getInstance().registerCommand(WIN_COMMAND_ID, new WindowsCommand());
}
}
Ich denke, die am besten geeigneten Kriterien für die Auswahl des einen oder anderen sind hauptsächlich die Begriffe, die Sie zur Benennung Ihrer Klassen und Methoden verwenden. Berücksichtigen Sie, dass wir alle dazu neigen sollten, auf Schnittstellen und nicht auf Klassen zu programmieren und uns auch auf das Ziel zu konzentrieren: Wir wollen bestimmen Welcher Code wird zur Laufzeit ausgeführt? Das heißt, wir können das Ziel erreichen, indem wir eines der beiden Muster verwenden.
Strategie und Fabrik sind unterschiedliche Zwecke. In der Strategie haben Sie den Ansatz definiert, mit diesem Muster können Sie das Verhalten (Algorithmen) austauschen. In der Fabrik gibt es viele Variationen. Das ursprüngliche Muster aus GO4 besagt jedoch, dass die Erstellung eines Objekts der untergeordneten Klasse überlassen bleibt. Hier ersetzen Sie ab Werk die vollständige Instanz und nicht das Verhalten, an dem Sie interessiert sind. Auf diese Weise ersetzen Sie das gesamte System und nicht den Algorithmus.
Das Factory-Muster ist ein Erstellungsmuster, das mit bestimmten Eigenschaften (Verhalten) erstellt wird. Während der Laufzeit nach der Erstellung können Sie die Eigenschaften (das Verhalten) nicht ändern. Wenn Sie also andere Eigenschaften (Verhalten) benötigen, müssen Sie das Objekt löschen und ein neues Objekt mit den erforderlichen Eigenschaften (Verhalten) erstellen. Das ist kein Gud. Im Falle eines Strategiemusters können Sie die Eigenschaften (Verhalten) zur Laufzeit ändern.