526 Stimmen

Was ist der grundlegende Unterschied zwischen den Factory und Abstract Factory Design Patterns?

Was ist der grundlegende Unterschied zwischen Factory und Abstract Factory Patterns?

14 Stimmen

Meiner Meinung nach ist die Qualität der Antworten in Unterschiede zwischen abstraktem Factory-Muster und Factory-Methode sind viel besser als die hier.

1 Stimmen

Der Hauptunterschied besteht darin, dass die Factory-Methode die Vererbung verwendet (die Indirektion ist vertikal, z. B. createThing() ) und Abstract Factory verwendet Komposition (die Indirektion ist horizontal, z. B. getFactory().createThing() )

1 Stimmen

Diese Frage ist nicht das, was einige ihrer Beantworter denken. Verpassen Sie nicht Tengis' Antwort die die drei unterschiedlichen Begriffe Factory, Abstract Factory und Factory Method definiert.

448voto

John Feminella Punkte 292907

Mit dem Factory-Muster erzeugen Sie Instanzen von Implementierungen ( Apple , Banana , Cherry usw.) einer bestimmten Schnittstelle - sagen wir, IFruit .

Mit dem abstrakten Factory-Muster können Sie jedem die Möglichkeit geben, eine eigene Factory zu erstellen. Dadurch kann Ihr Warehouse entweder ein IFruitFactory oder ein IJuiceFactory ohne dass Ihr Lagerhaus etwas über Früchte oder Säfte wissen muss.

0 Stimmen

@John,Muss eine Fabrik unbedingt Implementierungen einer Schnittstelle erzeugen? Kann sie nicht als eigenständige konkrete Klasse existieren, die keine Schnittstelle implementieren muss?

5 Stimmen

@SPI Ich glaube, Sie missverstehen mich; die Factory selbst muss nicht implementieren IFruit -- es instanziiert Dinge, die die IFruit . Natürlich ist es nicht brauchen um Instanzen von Dingen zu erzeugen, die eine bestimmte Schnittstelle implementieren, aber es ist wahrscheinlich ein Codegeruch, wenn Sie eine Factory haben, die Dinge erzeugt, die in keinerlei Beziehung zueinander stehen.

0 Stimmen

@John, danke für die Klärung! Für ein paar Stunden war mein gesamtes Glaubenssystem erschüttert, haha. Ich kann Ihnen nur zustimmen, was den Geruch des Codes angeht; es würde irgendwie den Zweck der Produktion über eine Fabrik zunichte machen, wenn die Produkte nicht miteinander verbunden wären, oder?

153voto

Sudhakar Kalmari Punkte 1811

Die Quelle für diese Informationen stammt aus: http://java.dzone.com/news/intro-design-patterns-abstract

Abstrakte Fabrik vs. Fabrikmethode

Die Methoden einer abstrakten Fabrik werden als Fabrikmethoden implementiert. Sowohl das Abstract Factory Pattern als auch das Factory Method Pattern entkoppeln das Client-System von den eigentlichen Implementierungsklassen durch die abstrakten Typen und Fabriken. Die Factory-Methode erzeugt Objekte durch Vererbung, während die Abstract Factory Objekte durch Komposition erzeugt.

Das Abstract Factory Pattern besteht aus einer AbstractFactory, ConcreteFactory, AbstractProduct, ConcreteProduct und Client.

Wie man sie umsetzt

Das Abstract Factory Pattern kann mit dem Factory Method Pattern, dem Prototype Pattern oder dem Singleton Pattern implementiert werden. Das ConcreteFactory-Objekt kann als Singleton implementiert werden, da nur eine Instanz des ConcreteFactory-Objekts benötigt wird.

Das Factory Method-Muster ist eine vereinfachte Version des Abstract Factory-Musters. Das Factory Method-Muster ist für die Erstellung von Produkten zuständig, die zu einer Familie gehören, während das Abstract Factory-Muster mehrere Produktfamilien behandelt.

Factory Method verwendet Schnittstellen und abstrakte Klassen, um den Client von der Generatorklasse und den daraus resultierenden Produkten zu entkoppeln. Abstract Factory hat einen Generator, der ein Container für mehrere Factory-Methoden ist, sowie Schnittstellen, die den Client vom Generator und den Produkten entkoppeln.

Wann wird das Factory-Methoden-Muster verwendet?

Verwenden Sie das Factory Method-Muster, wenn ein Client von einem bestimmten Produkt, das er verwendet, entkoppelt werden soll. Verwenden Sie die Factory-Methode, um einen Client von der Verantwortung für das Erstellen und Konfigurieren von Instanzen eines Produkts zu entlasten.

Wann wird das abstrakte Fabrikmuster verwendet?

Verwenden Sie das Abstract Factory Pattern, wenn Clients von Produktklassen entkoppelt werden müssen. Dies ist besonders nützlich für die Programmkonfiguration und -änderung. Das Abstract Factory-Muster kann auch Beschränkungen darüber auferlegen, welche Klassen mit anderen verwendet werden müssen. Es kann eine Menge Arbeit sein, neue konkrete Fabriken zu erstellen.

Beispiele:

Abstrakte Fabrik Beispiel 1

Diese Spezifikation für die Scheiben zur Zubereitung verschiedener Nudelsorten in einer Nudelmaschine ist die Abstrakte Fabrik, und jede spezifische Scheibe ist eine Fabrik. Alle Fabriken (Nudelmaschinen-Scheiben) erben ihre Eigenschaften von der abstrakten Fabrik. Jede einzelne Platte enthält die Information, wie die Nudeln zu erstellen sind, und der Pasta Maker nicht.

Abstrakte Fabrik Beispiel 2:

Das Stamping Equipment entspricht der Abstract Factory, denn es ist eine Schnittstelle für Operationen ist, die abstrakte Produktobjekte erzeugen. Die Matrizen entsprechen der Konkreten Fabrik, da sie ein konkretes Produkt erzeugen. Jede Teilekategorie (Motorhaube, Tür usw.) entspricht dem abstrakten Produkt. Spezifische Teile (z. B. Fahrertür für 99 Camry) entsprechen den den konkreten Produkten.

Beispiel für eine Fabrikmethode:

Die Spielzeugfirma entspricht dem Schöpfer, da sie die Fabrik zur Herstellung von Produktobjekten nutzen kann. Die Abteilung des Spielzeugunternehmens, die eine bestimmte Art von Spielzeug (Pferd oder Auto) herstellt, entspricht dem ConcreteCreator.

6 Stimmen

Vielen Dank für die Erläuterung von Abstract Factory und Factory Method. Ich habe nicht verstanden, wo wir die Komposition in der abstrakten Fabrik für die Erstellung von Objekten verwenden und wo wir die Vererbung in der Fabrikmethode verwenden. Es wäre sehr nützlich, wenn Sie einen Code posten würden, um dies zu erklären. Vielen Dank. Ich warte auf Ihren Code. Nochmals vielen Dank.

0 Stimmen

Auch hier wäre es viel übersichtlicher, wenn Kompositions- und Vererbungsansätze mit einem kurzen Beispiel (Quellcode) dargestellt würden.

0 Stimmen

105voto

cwap Punkte 10738

Fabrik-Muster: Die Fabrik produziert IProdukt-Implementierungen

Abstraktes Fabrik-Muster: Eine Fabrik produziert IFactories, die ihrerseits IProducts produzieren :)

[Aktualisierung nach den Kommentaren]
Was ich vorhin geschrieben habe, ist nicht korrekt nach Wikipedia zumindest. Eine abstrakte Fabrik ist einfach eine Fabrikschnittstelle. Mit ihr können Sie Ihre Fabriken zur Laufzeit wechseln, um verschiedene Fabriken in verschiedenen Kontexten zu ermöglichen. Beispiele könnten verschiedene Fabriken für verschiedene Betriebssysteme, SQL-Anbieter, Middleware-Treiber usw. sein.

6 Stimmen

Toll! Ist es richtig zu sagen, dass die abstrakte Fabrik ein Satz von Fabrikmethoden ist?

2 Stimmen

Ich schätze, das wäre richtig, aber es würde auch am Thema vorbeigehen :) Ein nicht analoges Beispiel könnte eine FileFactory sein, die Methoden wie CreateBitmapFile() oder CreateTextFile() hat. Nun wird man einen Verweis auf diese Fabrik an eine Art von Dienst übergeben. Aber was würde passieren, wenn Sie Ihren Dienst testen wollen? Sie müssten eine IFileFactory-Schnittstelle erstellen, um den Zugriff auf das Dateisystem zu simulieren. In der realen Welt würden Sie wahrscheinlich ein DI/IoC-Framework haben, das je nach Bedarf IFileFactories instanziiert. In diesem Fall würde das IoC-Framework als abstrakte Fabrik dienen.

6 Stimmen

Wenn ich das richtig verstehe, scheint diese Antwort zu implizieren, dass die Abstract Factory immer produziert weitere IFactories, die wiederum zur Erstellung von IProducts verwendet werden können. Die Darstellung in den GoF scheint mir dies nicht zu stützen und steht sogar im Widerspruch dazu: Eine Instanz einer Abstract Factory erzeugt direkt selbst IProducts. Mit anderen Worten, eine GoF Abstract Factory ist no (oder besser gesagt, muss nicht sein ) eine "Fabrik".

44voto

Syed Tayyab Ali Punkte 3555

Das abstrakte Fabrik-Muster

  • Bereitstellen einer Schnittstelle zur Erstellung von Familien von verwandten oder abhängigen Objekten ohne Angabe ihrer konkreten Klassen.

  • Das Muster der abstrakten Fabrik ist sehr ähnlich wie das Factory Method Muster. Ein Unterschied zwischen den beiden ist, dass beim Abstract Factory Muster, eine Klasse die Verantwortung für das Objekt Instanziierung an ein anderes Objekt über Komposition delegiert, während das Factory Methoden-Muster die Vererbung nutzt und sich auf eine Unterklasse verlässt, um die gewünschten Objektinstanziierung.

  • Eigentlich ist das delegierte Objekt häufig Fabrikmethoden, um um die Instanziierung durchzuführen!

Fabrikmuster

  • Fabrikmuster sind Beispiele für kreativen Mustern

  • Schöpfungsmuster abstrahieren das Prozess der Objektinstanziierung. Sie verbergen, wie Objekte erstellt werden und helfen machen das Gesamtsystem unabhängig davon, wie seine Objekte erstellt und zusammengesetzt werden.

  • Muster für die Klassenbildung konzentrieren sich auf die Verwendung von Vererbung zur Festlegung der zu instanziierenden Objekts Fabrik-Methode

  • Objektbezogene Schöpfungsmuster konzentrieren sich auf die Delegation der Instanziierung auf ein anderes Objekt Abstrakte Fabrik

Referenz: Fabrik vs. abstrakte Fabrik

7 Stimmen

Referenzlink ist tot

42voto

Ravindra babu Punkte 45577

Grundlegender Unterschied:

Fabrik: Erzeugt Objekte, ohne die Instanziierungslogik für den Client offenzulegen.

Fabrik-Methode : Definieren Sie eine Schnittstelle zur Erstellung eines Objekts, aber lassen Sie die Unterklassen entscheiden, welche Klasse instanziert werden soll. Mit der Factory-Methode kann eine Klasse die Instanziierung auf Unterklassen verschieben

Abstrakte Fabrik : Bietet eine Schnittstelle zur Erstellung von Familien verwandter oder abhängiger Objekte ohne Angabe ihrer konkreten Klassen.

AbstractFactory Muster verwendet Komposition, um die Verantwortung für die Erstellung eines Objekts an eine andere Klasse zu delegieren, während Fabrik-Methode Muster verwendet Vererbung und stützt sich auf abgeleitete Klassen oder Unterklassen, um Objekte zu erstellen

Von oodesign Artikel:

Fabrik Klassendiagramm:

enter image description here

Beispiel: StaticFactory

 public class ShapeFactory {

   //use getShape method to get object of type shape 
   public static Shape getShape(String shapeType){
      if(shapeType == null){
         return null;
      }     
      if(shapeType.equalsIgnoreCase("CIRCLE")){
         return new Circle();

      } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new Rectangle();

      } else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
      }

      return null;
   }
}

Ein Beispiel für eine nicht statische Fabrik, die FactoryMethod implementiert, ist in diesem Beitrag verfügbar:

Entwurfsmuster: Fabrik vs. Fabrikmethode vs. Abstrakte Fabrik

Wann zu verwenden: Der Kunde braucht nur eine Klasse und kümmert sich nicht darum, welche konkrete Implementierung er erhält.

Fabrik-Methode Klasse digaram:

enter image description here

Wann zu verwenden: Der Kunde weiß nicht, welche konkreten Klassen er zur Laufzeit erstellen muss, sondern möchte nur eine Klasse erhalten, die die Aufgabe erfüllt.

Abstrakte Fabrik Klassendiagramm aus dzone

enter image description here

Wann zu verwenden: Wenn Ihr System mehrere Produktfamilien erstellen muss oder Sie eine Produktbibliothek bereitstellen möchten, ohne die Implementierungsdetails offenzulegen.

Die Quellcode-Beispiele in den obigen Artikeln sind sehr gut, um die Konzepte klar zu verstehen.

Verwandte SE-Frage mit Code-Beispiel:

Fabrik-Muster. Wann sollten Fabrikmethoden verwendet werden?

Die Unterschiede:

  1. Abstrakte Factory-Klassen werden oft mit Factory-Methoden implementiert, können aber auch mit Prototypen implementiert werden
  2. Entwürfe beginnen mit der Factory-Methode (weniger kompliziert, mehr anpassbar, Unterklassen vermehren sich) und entwickeln sich zu anderen Erstellungsmustern (flexibler, komplexer), wenn mehr Flexibilität erforderlich ist.
  3. Fabrikmethoden werden in der Regel innerhalb von Vorlagenmethoden aufgerufen.

Weitere nützliche Artikel:

werk_method aus der Quellenherstellung

abstrakte_fabrik aus der Quellenherstellung

abstraktes-fabrik-gestaltetes-muster von journaldev

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X