it-swarm.com.de

Was ist der Unterschied zwischen Fabrik- und Strategiemustern?

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).

128
Sappidireddy

Ein Fabrikmuster ist ein Schöpfungsmuster. Ein Strategiemuster ist ein Betriebsmuster. Anders ausgedrückt wird ein Factory-Muster verwendet, um Objekte eines bestimmten Typs zu erstellen. Ein Strategiemuster wird verwendet, um eine Operation (oder einen Satz von Operationen) auf eine bestimmte Art und Weise auszuführen. Im klassischen Beispiel kann eine Fabrik verschiedene Arten von Tieren erstellen: Hund, Katze, Tiger, während ein Strategiemuster bestimmte Aktionen ausführt, z. B. Bewegen. Verwenden von Run-, Walk- oder Lope-Strategien.

In der Tat können die beiden zusammen verwendet werden. Möglicherweise haben Sie eine Factory, die Ihre Geschäftsobjekte erstellt. Es können unterschiedliche Strategien basierend auf dem Persistenzmedium verwendet werden. Wenn Ihre Daten lokal in XML gespeichert werden, wird eine Strategie angewendet. Wenn die Daten in einer anderen Datenbank entfernt wären, würden sie eine andere verwenden.

191
tvanfosson

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 auf Abstraktionen anstatt auf "Konkretionen" anwenden, sehen viele Muster wie Variationen eines Themas aus.

24
jlembke

Um nur das zu ergänzen, was Tvanfosson gesagt hat, sehen viele der Muster in Bezug auf die Implementierung gleich aus. Das heißt, Sie haben häufig eine Schnittstelle erstellt, in der möglicherweise noch keine zuvor in Ihrem Code vorhanden war, und anschließend eine Reihe von Implementierungen dieser Schnittstelle erstellt. Der Unterschied liegt in ihrem Zweck und wie sie verwendet werden.

20
Gary Kephart
  • Das Factory-Muster (Methode).

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

  • Das Strategiemuster.

Verkapseln Sie den Algorithmus (die Schritte), um eine Aktion auszuführen. So können Sie die Strategie ändern und einen anderen Algorithmus verwenden.

Während beide sehr ähnlich aussehen, ist der Zweck ziemlich unterschiedlich. Ein Zweck besteht darin, eine andere Aktion auszuführen.

So. Wenn Ihre Factory-Methode festgelegt ist, haben Sie sie möglicherweise folgendermaßen:

 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 benötigt eine erweiterte oder dynamischere Erstellung. 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.

10
OscarRyz

Zunächst muss zwischen einfacher 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, während Sie in der letzteren eine Verbindung zu einer Factory-Schnittstelle herstellen (die die Methodennamen definiert) und dann die verschiedenen Factorys aufrufen, die diese Schnittstelle implementieren sollen unterschiedliche Implementierungen derselben Methode basierend auf einigen Kriterien haben. Zum Beispiel haben wir eine ButtonCreationFactory-Schnittstelle, die von zwei Fabriken implementiert wird, der ersten WindowsButtonCreationFactory (erstellt Schaltflächen mit Windows-Erscheinungsbild) und der zweiten LinuxButtonCreationFactory (erstellt Schaltflächen mit Linux-Erscheinungsbild). Beide Fabriken verfügen also über dieselbe Erstellungsmethode mit unterschiedlichen Implementierungen (Algorithmen). Sie können dies in der Laufzeit anhand der Methode referenzieren, die Sie für die gewünschte Schaltfläche verwenden.

Zum Beispiel, wenn Sie Schaltflächen mit Linux-Erscheinungsbild wünschen:

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 ergibt sich eine Art Strategiemuster, da Algorithmen für die Erstellung differenziert werden. Es unterscheidet sich jedoch semantisch davon, da es eher für die OBJEKTERSTELLUNG als für Betriebsalgorithmen verwendet wird. Im Grunde genommen haben Sie bei Abstract Factory die Möglichkeit, Objekte mit unterschiedlichen Strategien zu erstellen, was das Strategiemuster sehr ähnlich macht. Die AbstractFactory ist jedoch kreativ, während das Strategiemuster funktionsfähig ist. In Bezug auf die Implementierung sind sie gleich.

9
interboy

Factory (und von Factory zurückgegebene FactoryMethod) :

  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 neue Concrete Objects für die Schnittstelle einsetzen, 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 diese an Wikipedia-Artikel und javarevisited Artikel

Strategiemuster:

  1. Es ist ein Verhaltensmuster
  2. Es basiert auf Delegation
  3. Es ändert die Eingeweide des Objekts, indem das Verhalten der Methode geändert wird
  4. Es wird verwendet, um zwischen verschiedenen 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 Juni bis Juni keinen Rabatt auf den Artikel.

Zusammenhängende Posts:

Beispiel aus der Praxis des Strategiemusters

Entwurfsmuster: Factory vs Factory-Methode vs Abstract Factory

8
Ravindra babu

Ein Strategiemuster ist in einfachen Worten eher die Erstellung von Verhalten zur Laufzeit, wenn Sie sich nicht mit der implementierenden Klasse befassen. Auf der anderen Seite hat Factory die Erstellung einer konkreten Klasseninstanz zur Laufzeit und es liegt an Ihnen, jedes Verhalten (Methode) zu verwenden, das von der implementierten Schnittstelle verfügbar gemacht wird.

3
Gurum

Um auf das, was Oscar sagte und in Bezug auf seinen Code zu erweitern:

GetCommand ist die Factory und die UnixCommand-, WindowsCommand- und OSXCommand-Klassen sind Strategien

2
Spechal

Sie können den Unterschied nicht einfach anhand des Codes oder der Kategorisierung verstehen. Um die GoF-Muster richtig zu erfassen, achten Sie auf ihre Absichten:

Strategie: "Definieren Sie eine Familie von Algorithmen, kapseln Sie sie und machen Sie sie austauschbar. Mit Strategie kann der Algorithmus unabhängig von den Clients, die ihn verwenden, variieren."

Factory-Methode: "Definieren Sie eine Schnittstelle zum Erstellen eines Objekts, aber lassen Sie Unterklassen entscheiden, welche Klasse instanziiert werden soll. Mit 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: nterschied zwischen Fabrikmethode und Strategie-Entwurfsmustern

1
user2920760

Strategie und Fabrik sind unterschiedliche Zwecke. In der Strategie haben Sie den Ansatz definiert, mit diesem Muster können Sie das Verhalten (Algorithmen) austauschen. Als wir zur Fabrik kommen, gibt es viele Variationen. Aber das ursprüngliche Muster von GO4 besagt, dass die Fabrik die Erstellung des Objekts der Kinderklasse überlässt. Hier ersetzen Sie mit der Fabrik die gesamte Instanz, nicht das Verhalten, an dem Sie interessiert sind. Auf diese Weise ersetzen Sie das gesamte System, nicht den Algorithmus.

1
Brainchild

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 festgelegten Anzahl bestimmter zu instanziierender Klassen abhängen. 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, das am besten geeignete Kriterium für die Auswahl der einen oder anderen Kategorie sind meistens die Begriffe, die Sie verwenden, um Ihre Klassen und Methoden zu benennen. Berücksichtigen Sie dabei, dass wir alle dazu tendieren 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.

1
Rick B.

Factory-Muster ist ein Erstellungsmuster, das mit festgelegten 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 nicht gud. Im Falle eines Strategiemusters kann u die Eigenschaften (das Verhalten) zur Laufzeit ändern.

0
user1808932