Was ist der Unterschied zwischen Fabrik- und Strategiemustern?

Lesezeit: 5 Minuten

Benutzer-Avatar
Sappidireddy

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

Ein Fabrikmuster ist ein Kreationsmuster. Ein Strategiemuster ist ein operatives Muster. Anders ausgedrückt, ein Fabrikmuster 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 könnte eine Fabrik verschiedene Arten von Tieren erstellen: Hund, Katze, Tiger, während ein Strategiemuster bestimmte Aktionen ausführen würde, z. B. Bewegen; mit Run-, Walk- oder Lope-Strategien.

Tatsächlich können die beiden zusammen verwendet werden. Beispielsweise können Sie eine Fabrik haben, die Ihre Geschäftsobjekte erstellt. Es kann basierend auf dem Persistenzmedium unterschiedliche Strategien verwenden. Wenn Ihre Daten lokal in XML gespeichert werden, würde es eine Strategie verwenden. Wenn die Daten entfernt in einer anderen Datenbank lägen, würde sie eine andere verwenden.

  • ` Ein Strategiemuster wird verwendet, um eine Operation (oder eine Reihe von Operationen) auf eine bestimmte Weise auszuführen` Bedeutet es Operationen über Objekte?

    – OPV

    7. Februar 2019 um 13:21 Uhr

Benutzer-Avatar
jembke

Das Strategiemuster ermöglicht es Ihnen, das Verhalten einer Klasse polymorph zu ändern.

Mit dem Fabrikmuster können Sie die Objekterstellung kapseln.

Gary macht einen großen Punkt. Wenn Sie das Prinzip der Codierung von Abstraktionen anstelle von “Konkretionen” verwenden, sehen viele der Muster wie Variationen eines Themas aus.

Nur um das zu ergänzen, was tvanfosson gesagt hat, viele der Muster sehen in Bezug auf die Implementierung gleich aus. Das heißt, Sie müssen häufig eine Schnittstelle erstellen, wo in Ihrem Code zuvor vielleicht keine vorhanden war, und dann eine Reihe von Implementierungen dieser Schnittstelle erstellen. Der Unterschied liegt in ihrem Zweck und ihrer Verwendung.

Zunächst muss zwischen einfacher Fabrik und abstrakter Fabrik unterschieden 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 Fabrikschnittstelle herstellen (die die Methodennamen definiert) und dann die verschiedenen Fabriken aufrufen, die diese Schnittstelle implementieren sollen basierend auf bestimmten Kriterien unterschiedliche Implementierungen derselben Methode haben. Zum Beispiel haben wir eine ButtonCreationFactory-Schnittstelle, die von zwei Factorys implementiert wird, der ersten WindowsButtonCreationFactory (erstellt Schaltflächen mit Windows-Look-and-Feel) und der zweiten LinuxButtonCreationFactory (erstellt Schaltflächen mit Linux-Look-and-Feel). Diese beiden Fabriken haben also dieselbe Erstellungsmethode mit unterschiedlichen Implementierungen (Algorithmen). Sie können darauf in der Laufzeit basierend auf der Methode verweisen, die Sie für die gewünschte Schaltfläche eingeben.

Wenn Sie beispielsweise Schaltflächen mit Linux-Look-and-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 ergibt sich eine Art Strategiemuster, da es Algorithmen zur Erstellung unterscheidet. Es unterscheidet sich jedoch semantisch davon, da es für die OBJEKTERZEUGUNG und nicht für Betriebsalgorithmen verwendet wird. Bei der abstrakten Fabrik haben Sie also im Grunde eine Objekterstellung mit unterschiedlichen Strategien, was sie dem Strategiemuster sehr ähnlich macht. Die AbstractFactory ist jedoch kreativ, während das Strategiemuster operativ ist. In Bezug auf die Implementierung sind sie gleich.

Benutzer-Avatar
Ravindra Babu

Factory (und FactoryMethod zurückgegeben von Factory):

  1. Schöpfungsmuster
  2. Basierend auf Erbschaft
  3. Factory gibt eine Factory-Methode (Schnittstelle) zurück, die wiederum ein konkretes Objekt zurückgibt
  4. Sie können die Schnittstelle durch neue konkrete Objekte ersetzen, und der Client (Aufrufer) sollte nicht alle konkreten Implementierungen kennen
  5. Der Client greift immer nur auf die Schnittstelle zu und Sie können die Objekterstellungsdetails in der Factory-Methode ausblenden

Schau dir das an Wikipedia-Artikel und Javabesuchter Artikel

Strategiemuster:

  1. Es ist ein Verhaltensmuster
  2. Es basiert auf Delegation
  3. Es ändert den Inhalt 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 (Flugticket oder Einkaufswagenartikel) konfigurieren. In diesem Beispiel bieten Sie von Juli bis Dezember 25 % Rabatt auf einen Artikel und von Januar bis Juni keinen Rabatt auf den Artikel.

Zusammenhängende Posts:

Beispiel aus der realen Welt für das Strategiemuster

Entwurfsmuster: Factory vs. Factory-Methode vs. Abstract Factory

Benutzer-Avatar
OscarRyz

  • Das Fabrikmuster (Methode).

Erstellen Sie nur konkrete Instanzen. Unterschiedliche Argumente können zu unterschiedlichen Objekten führen. Das hängt von der Logik usw.

  • Das Strategiemuster.

Kapseln Sie den 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 besteht darin, zu erschaffen, der andere, eine Aktion auszuführen.

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

 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 fortgeschrittenere oder dynamischere Erstellung. Sie können der Fabrikmethode eine Strategie hinzufügen und sie ändern, ohne neu kompilieren zu müssen, die Strategie kann sich zur Laufzeit ändern.

Um das zu erweitern, was Oscar gesagt hat, und in Bezug auf seinen Kodex:

Der getCommand ist die Factory und die Klassen UnixCommand, WindowsCommand und OSXCommand sind Strategien

1352410cookie-checkWas ist der Unterschied zwischen Fabrik- und Strategiemustern?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy