Was ist der Unterschied zwischen Fabrik- und Strategiemustern?

Antworten:

226

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.

Tvanfosson
quelle
1
"Ein Strategiemuster wird verwendet, um eine Operation (oder einen Satz von Operationen) auf eine bestimmte Weise auszuführen." Bedeutet dies Operationen über Objekten?
OPV
32

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.

jlembke
quelle
25

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.

Gary Kephart
quelle
13
  • Das Factory (Methode) Muster.

Erstellen Sie nur konkrete Instanzen. Unterschiedliche Argumente können zu unterschiedlichen Objekten führen. Es kommt auf die Logik usw. an.

  • Das Strategiemuster.

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.

OscarRyz
quelle
Ich glaube nicht, dass Sie hier einen richtigen Punkt machen. Zuallererst besteht einer der Gründe für diese Muster darin, Bedingungen zugunsten des Polymorphismus zu vermeiden. Zunächst muss ein Unterschied zwischen einer einfachen Fabrik und einer abstrakten Fabrik gemacht werden. Die erste ist eine einfache Fabrik, in der Sie nur eine Klasse haben, die als Fabrik für die Objekterstellung fungiert, während Sie in letzterer eine Verbindung zu einer Schnittstelle herstellen und dann aufrufen die verschiedenen Fabriken, die diese Schnittstelle implementieren, die aufgrund einiger Kriterien unterschiedliche Implementierungen derselben Methode haben sollen. (fährt fort)
Interboy
4
Genau in diesem Fall führt dies zu einer Art Strategiemuster, das sich jedoch semantisch davon unterscheidet, da es eher für die OBJEKTERSTELLUNG als für Operationen verwendet wird. Grundsätzlich haben Sie also eine Objekterstellung mit verschiedenen Strategien.
Interboy
2
@OscarRyz Können Sie bitte Ihre Antwort mit einem Programm aktualisieren, das beide beschreibt
Prakash Pandey
11

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.

Interboy
quelle
10

Factory (und FactoryMethod, die von Factory zurückgegeben werden) :

  1. Schöpfungsmuster
  2. Basierend auf Vererbung
  3. Factory gibt eine Factory-Methode (Schnittstelle) zurück, die wiederum Concrete Object zurückgibt
  4. Sie können die Schnittstelle durch neue konkrete Objekte ersetzen, und der Client (Aufrufer) sollte nicht über alle konkreten Implementierungen informiert sein
  5. Der Client greift immer nur auf die Benutzeroberfläche zu und Sie können Details zur Objekterstellung in der Factory-Methode ausblenden

Schauen Sie sich diesen Wikipedia-Artikel und den von Javarevisierten Artikel an

Strategiemuster:

  1. Es ist ein Verhaltensmuster
  2. Es basiert auf Delegation
  3. Es ändert die Eingeweide des Objekts, indem es das Methodenverhalten ändert
  4. Es wird verwendet, um zwischen einer Familie von Algorithmen zu wechseln
  5. Es ändert das Verhalten des Objekts zur Laufzeit

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

Ravindra Babu
quelle
3

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


quelle
3

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.

Gurum
quelle
2

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

Cristik
quelle
1

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.

Rick B.
quelle
1

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.

Brainchild
quelle
0

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.

user1808932
quelle