Was ist der grundlegende Unterschied zwischen den Factory- und den Abstract Factory-Mustern?
design-patterns
factory
abstract-factory
factory-method
user366312
quelle
quelle
createThing()
) und Abstract Factory die Komposition verwendet (Indirektion ist horizontal, z. B.getFactory().createThing()
)Antworten:
Mit der Fabrik Muster erzeugen Sie Instanzen von Implementierungen (
Apple
,Banana
,Cherry
, usw.) einer bestimmten Schnittstelle - sagen wirIFruit
.Mit dem Abstract Factory-Muster bieten Sie jedem die Möglichkeit, seine eigene Fabrik bereitzustellen. Auf diese Weise kann Ihr Lager entweder ein
IFruitFactory
oder ein Lager seinIJuiceFactory
, ohne dass Ihr Lager etwas über Obst oder Säfte wissen muss.quelle
IFruit
- sie instanziiert Dinge, die implementiert werdenIFruit
. Natürlich ist es nicht brauchen , zu produzieren Instanzen der Dinge , die eine bestimmte Schnittstelle implementieren, aber es ist wahrscheinlich ein Code Geruch , wenn Sie eine Fabrik haben , die Dinge , die völlig unabhängig von einander sind produziert.Abstrakte Fabrik vs. Fabrikmethode
Die Methoden einer Abstract Factory werden als Factory-Methoden implementiert. Sowohl das Abstract Factory Pattern als auch das Factory Method Pattern entkoppeln das Client-System von den tatsächlichen Implementierungsklassen durch die abstrakten Typen und Fabriken. Die Factory-Methode erstellt Objekte durch Vererbung, während die Abstract Factory Objekte durch Komposition erstellt.
Das Abstract Factory Pattern besteht aus einer AbstractFactory, einer ConcreteFactory, einem AbstractProduct, einem ConcreteProduct und einem Client.
Wie zu implementieren
Das abstrakte Factory-Muster kann mithilfe des Factory-Methodenmusters, des Prototypmusters oder des Singleton-Musters implementiert werden. Das ConcreteFactory-Objekt kann als Singleton implementiert werden, da nur eine Instanz des ConcreteFactory-Objekts benötigt wird.
Das Factory-Methodenmuster ist eine vereinfachte Version des Abstract Factory-Musters. Das Factory-Methodenmuster ist für die Erstellung von Produkten verantwortlich, die zu einer Familie gehören, während das abstrakte Factory-Muster mehrere Produktfamilien behandelt.
Die Factory-Methode verwendet Schnittstellen und abstrakte Klassen, um den Client von der Generatorklasse und den resultierenden Produkten zu entkoppeln. Abstract Factory verfügt über einen Generator, der ein Container für verschiedene Factory-Methoden ist, sowie über Schnittstellen, die den Client vom Generator und den Produkten entkoppeln.
Wann wird das Factory-Methodenmuster verwendet?
Verwenden Sie das Factory-Methodenmuster, wenn ein Client von einem bestimmten Produkt, das er verwendet, entkoppelt werden muss. Verwenden Sie die Factory-Methode, um einen Client von der Verantwortung für das Erstellen und Konfigurieren von Instanzen eines Produkts zu entbinden.
Wann wird das abstrakte Factory-Muster verwendet?
Verwenden Sie das Abstract Factory-Muster, wenn Clients von Produktklassen entkoppelt werden müssen. Besonders nützlich für die Programmkonfiguration und -änderung. Das Abstract Factory-Muster kann auch Einschränkungen erzwingen, welche Klassen mit anderen verwendet werden müssen. Es kann eine Menge Arbeit sein, neue konkrete Fabriken zu bauen.
Beispiele:
Beispiel 1 für eine abstrakte Fabrik
Diese Spezifikation für die Datenträger zum Zubereiten verschiedener Arten von Nudeln in einem Nudelhersteller ist die Abstract Factory, und jeder bestimmte Datenträger ist eine Factory. Alle Fabriken (Pasta Maker Disks) erben ihre Eigenschaften von der abstrakten Factory. Jede einzelne Festplatte enthält Informationen zum Erstellen der Nudeln, der Nudelhersteller jedoch nicht.
Abstract Factory Beispiel 2:
Die Stanzausrüstung entspricht der Abstract Factory, da sie eine Schnittstelle für Vorgänge ist, mit denen abstrakte Produktobjekte erstellt werden. Die Matrizen entsprechen der Betonfabrik, da sie ein Betonprodukt erzeugen. Jede Teilekategorie (Motorhaube, Tür usw.) entspricht dem abstrakten Produkt. Bestimmte Teile (dh Fahrertür für 99 Camry) entsprechen den Betonprodukten.
Beispiel für eine Fabrikmethode:
Die Spielzeugfirma entspricht dem Schöpfer, da sie die Fabrik verwenden kann, um Produktobjekte zu erstellen. Die Abteilung des Spielzeugherstellers, der eine bestimmte Art von Spielzeug (Pferd oder Auto) herstellt, entspricht dem ConcreteCreator.
quelle
Fabrikmuster: Die Fabrik produziert IProduct-Implementierungen
Abstraktes Fabrikmuster: Eine Fabrikfabrik produziert IFactories, die wiederum IProducts produzieren :)
[Update gemäß den Kommentaren]
Was ich früher geschrieben habe, ist laut Wikipedia zumindest nicht korrekt . Eine abstrakte Fabrik ist einfach eine Fabrikschnittstelle. Damit können Sie Ihre Fabriken zur Laufzeit wechseln, um verschiedene Fabriken in verschiedenen Kontexten zuzulassen. Beispiele könnten verschiedene Fabriken für verschiedene Betriebssysteme, SQL-Anbieter, Middleware-Treiber usw. sein.
quelle
Das abstrakte Fabrikmuster
Stellen Sie eine Schnittstelle zum Erstellen von Familien verwandter oder abhängiger Objekte bereit, ohne deren konkrete Klassen anzugeben.
Das Abstract Factory-Muster ist dem Factory Method-Muster sehr ähnlich. Ein Unterschied zwischen beiden besteht darin, dass beim Abstract-Factory-Muster eine Klasse die Verantwortung für die Objektinstanziierung über die Komposition an ein anderes Objekt delegiert, während das Factory-Methodenmuster die Vererbung verwendet und sich auf eine Unterklasse stützt, um die gewünschte Objektinstanziierung zu handhaben.
Tatsächlich verwendet das delegierte Objekt häufig Factory-Methoden, um die Instanziierung durchzuführen!
Fabrikmuster
Fabrikmuster sind Beispiele für Schöpfungsmuster
Schöpfungsmuster abstrahieren den Objektinstanziierungsprozess. Sie verbergen, wie Objekte erstellt werden, und helfen dabei, das Gesamtsystem unabhängig davon zu machen, wie seine Objekte erstellt und zusammengesetzt werden.
Klassenerstellungsmuster konzentrieren sich auf die Verwendung der Vererbung, um das zu instanziierende Objekt zu bestimmen. Factory-Methode
Objekterstellungsmuster konzentrieren sich auf die Delegierung der Instanziierung an ein anderes Objekt Abstract Factory
Referenz: Factory vs Abstract Factory
quelle
Factory-Methode: Sie haben eine Factory, die Objekte erstellt, die von einer bestimmten Basisklasse abgeleitet sind
Abstrakte Fabrik: Sie haben eine Fabrik, die andere Fabriken erstellt , und diese Fabriken erstellen wiederum Objekte, die von Basisklassen abgeleitet sind. Sie tun dies, weil Sie häufig nicht nur ein einzelnes Objekt erstellen möchten (wie bei der Factory-Methode), sondern eine Sammlung verwandter Objekte erstellen möchten.
quelle
Abstract Factory ist eine Schnittstelle zum Erstellen verwandter Objekte, die Factory-Methode ist jedoch eine Methode. Die abstrakte Fabrik wird durch die Fabrikmethode implementiert.
quelle
Grundlegender Unterschied:
Factory: Erstellt Objekte, ohne die Instanziierungslogik dem Client zur Verfügung zu stellen.
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
Abstract Factory : Bietet eine Schnittstelle zum Erstellen von Familien verwandter oder abhängiger Objekte, ohne deren konkrete Klassen anzugeben.
Das AbstractFactory- Muster verwendet die Komposition, um die Verantwortung für das Erstellen eines Objekts an eine andere Klasse zu delegieren, während das Factory-Methodenmuster die Vererbung verwendet und sich beim Erstellen des Objekts auf abgeleitete Klassen oder Unterklassen stützt
Aus oodesign Artikeln:
Factory - Klassendiagramm:
Beispiel: StaticFactory
In diesem Beitrag finden Sie ein Beispiel für die Implementierung von FactoryMethod in einer nicht statischen Factory:
Entwurfsmuster: Factory vs Factory-Methode vs Abstract Factory
Verwendungszweck: Der Client benötigt nur eine Klasse und kümmert sich nicht darum, welche konkrete Implementierung er erhält.
Factory Method Klasse Digaram:
Verwendungszweck: Der Client weiß nicht, welche konkreten Klassen zur Laufzeit erstellt werden müssen, sondern möchte nur eine Klasse erhalten, die die Aufgabe übernimmt.
Abstract Factory Klassendiagramm von dzone
Verwendungszweck: Wenn Ihr System mehrere Produktfamilien erstellen muss oder Sie eine Produktbibliothek bereitstellen möchten, ohne die Implementierungsdetails offenzulegen.
Quellcodebeispiele in den obigen Artikeln sind sehr gut, um die Konzepte klar zu verstehen.
Verwandte SE-Frage mit Codebeispiel:
Fabrikmuster. Wann werden Werksmethoden angewendet?
Unterschiede:
Andere nützliche Artikel:
factory_method aus der Quellenherstellung
abstract_factory aus der Quellenherstellung
Abstract-Factory-Design-Muster von journaldev
quelle
Beispiel / Szenario für Abstract Factory
Ich lebe an einem Ort, an dem es in der Regenzeit regnet, im Winter schneit und im Sommer heiß und sonnig. Ich brauche verschiedene Arten von Kleidung, um mich vor den Elementen zu schützen. Dazu gehe ich in den Laden in der Nähe meines Hauses und bitte um Kleidung / Gegenstände, um mich zu schützen. Der Ladenbesitzer gibt mir den passenden Artikel entsprechend der Umgebung und Tiefe meiner Tasche. Die Artikel, die er mir gibt, sind von gleicher Qualität und Preisklasse. Da er sich meiner Standards bewusst ist, fällt es ihm leicht, dies zu tun. Aber wenn ein reicher Mann von der anderen Straßenseite die gleichen Anforderungen hat, bekommt er einen teuren Markenartikel. Auffällig ist, dass sich alle Artikel, die er mir gibt, in Bezug auf Qualität, Standard und Kosten ergänzen. Man kann sagen, dass sie miteinander gehen. Gleiches gilt für die Gegenstände, die dieser reiche Kerl bekommt.
Wenn ich mir das obige Szenario anschaue, schätze ich jetzt die Effizienz des Ladenbesitzers. Ich kann diesen Ladenbesitzer durch einen Abstract Shop ersetzen. Die Gegenstände, die wir mit abstrakten Gegenständen bekommen, und ich und die Reichen als Perspektivkunden. Alles was wir brauchen ist das Produkt / der Artikel, der unseren Bedürfnissen entspricht.
Jetzt kann ich mir leicht vorstellen, einen Online-Shop in Betracht zu ziehen, der seinen zahlreichen Kunden eine Reihe von Dienstleistungen bietet. Jeder Kunde gehört zu einer der drei Gruppen. Wenn ein Premium-Gruppenbenutzer die Website öffnet, erhält er eine großartige Benutzeroberfläche, einen hochgradig angepassten Werbebereich, mehr Optionen in den Menüs usw. Dieselben Funktionen werden Goldbenutzern angeboten, aber die Funktionen im Menü sind geringer. Anzeigen sind meistens relevant. und etwas weniger egronomische Benutzeroberfläche. Zuletzt ist meine Art von Benutzer, ein Benutzer der 'freien Gruppe'. Ich werde gerade genug bedient, damit ich nicht beleidigt werde. Die Benutzeroberfläche ist ein absolutes Minimum, Werbung ist so weit vom Kurs entfernt, dass ich nicht weiß, was darin enthalten ist. Schließlich hat sich das Menü nur abgemeldet.
Wenn ich die Möglichkeit bekomme, so etwas wie diese Website zu erstellen, würde ich definitiv Abstract Factory Pattern in Betracht ziehen.
Abstrakte Produkte: Werbebereich, Menü, UI-Maler.
Abstrakte Factory: Web Store-Benutzererfahrung
Concreate Factory: Premium-Benutzererfahrung, Gold-Benutzererfahrung, allgemeine Benutzererfahrung.
quelle
Viele Menschen werden sich vielleicht überrascht fühlen, aber diese Frage ist falsch . Wenn Sie diese Frage während eines Interviews hören, müssen Sie dem Interviewer helfen, zu verstehen, wo die Verwirrung liegt.
Beginnen wir mit der Tatsache, dass es kein konkretes Muster gibt, das nur "Fabrik" genannt wird. Es gibt ein Muster, das als "abstrakte Fabrik" bezeichnet wird, und es gibt ein Muster, das als "Fabrikmethode" bezeichnet wird.
Was bedeutet dann "Fabrik"? eine der folgenden (alle können je nach Umfang der Referenz als korrekt angesehen werden):
Und leider verwenden viele Leute "Fabrik", um eine andere Art von Fabrik zu bezeichnen, die Fabrik oder Fabriken (oder deren Schnittstellen) schafft. Basierend auf ihrer Theorie:
Um zu verstehen, wie dumm das ist, setzen wir unsere Gleichung fort:
Ich hoffe du verstehst den Punkt. Seien Sie nicht verwirrt und erfinden Sie bitte keine Dinge, die es aus gutem Grund nicht gibt.
- -
PS : Factory for Products ist AbstractFactory, und Factory for Abstract Factories wäre nur ein weiteres Beispiel für AbstractFactory.
quelle
Die Lehrbuchdefinitionen werden bereits durch andere Antworten bereitgestellt. Ich dachte, ich würde auch ein Beispiel dafür liefern.
Hier
PizzaIngredientsFactory
ist also eine abstrakte Fabrik , die Methoden zum Erstellen einer Familie verwandter Produkte bietet.Beachten Sie, dass jede Methode in der Abstract-Factory eine Factory-Methode für sich ist. Like
createDough()
ist an sich eine Factory-Methode, deren konkrete Implementierungen von Unterklassen wie bereitgestellt werdenNYPizzaIngredientsFactory
. Wenn Sie dies verwenden, kann jeder unterschiedliche Standort Instanzen konkreter Zutaten erstellen, die zu ihrem Standort gehören.Fabrikmethode
Im Beispiel:
-
createDough()
- liefert eine konkrete Umsetzung für Teig. Das ist also eine FabrikmethodeAbstrakte Fabrik
Im Beispiel:
-
PizzaIngredientsFactory
ist eine abstrakte Factory, mit der eine verwandte Menge von Objekten wie ,, erstelltDough
werdenClams
kann.Sauce
. Zum Erstellen jeder Objektfamilie wird eine Factory-Methode bereitgestellt.Beispiel aus Head First-Entwurfsmustern
quelle
Ich habe einige Punkte, die ich mit Johns Antwort wie folgt beitragen kann:
Abstrakte Fabrik ist eine Fabrik der Fabriken!
Mit der „Factory Method“ (weil nur „Factory“ mehrdeutig ist), erzeugen Sie Implementierungen (
Lemon
,Orange
usw.) eine bestimmten Schnittstelle - sagt sieIFruit
. Diese Fabrik könnte genannt werdenCitricFruitFactory
.Jetzt möchten Sie jedoch andere Obstsorten erstellen, die von der CitricFruitFactory nicht erstellt werden können. Vielleicht macht der Code von
CitricFruitFactory
keinen Sinn, wenn Sie einenStrawberry
darin erstellen (Erdbeere ist keine Zitronenfrucht!).So haben Sie eine neue Fabrik schaffen könnte genannt ,
RedFruitFactory
die produziertStrawberry
,Raspberry
usw.Wie John Feminella sagte: "Mit dem Abstract Factory-Muster erstellen Sie Implementierungen einer bestimmten Factory-Schnittstelle - z
IFruitFactory
. B .. Jeder von ihnen weiß, wie man verschiedene Obstsorten erstellt."Die Implementierungen von
IFruitFactory
sindCitricFruitFactory
undRedFruitFactory
!quelle
Meine Quellen sind:
StackOverflow
,tutorialspoint.com
,programmers.stackexchange.com
undCodeProject.com
.Factory Method
(auch genanntFactory
) dient zum Entkoppeln des Clients einerInterface
Implementierung. Zum Beispiel haben wir eineShape
Schnittstelle mit zweiCircle
undSquare
Implementierungen. Wir haben eine Factory-Klasse mit einer Factory-Methode mit einem Bestimmungsparameter wieType
und einer neuen verwandten Implementierung derShape
Schnittstelle definiert.Abstract Factory
enthält mehrere Factory-Methoden oder eine Factory-Schnittstelle von mehreren Factory-Implementierungen. Für das nächste obige Beispiel haben wir eineColor
Schnittstelle mit zweiRed
undYellow
Implementierungen. Wir haben eineShapeColorFactory
Schnittstelle mit zweiRedCircleFactory
und definiertYellowSquareFactory
. Der folgende Code zur Erläuterung dieses Konzepts:Hier Unterschied zwischen
FactoryMethod
undAbstractFactory
.Factory Method
Geben Sie einfach eine konkrete Klasse einer Schnittstelle zurück, aberAbstract Factory
kehren Sie zurückfactory of factory
. Mit anderen Worten,Abstract Factory
geben Sie verschiedene Kombinationen einer Reihe von Schnittstellen zurück.Ich hoffe meine Erklärung hilfreich.
quelle
Der Hauptunterschied in diesen Fabriken besteht darin, wann Sie mit den Fabriken arbeiten möchten und wann Sie sie verwenden möchten.
Wenn Sie IOC (Inversion der Steuerung, z. B. Konstruktorinjektion) ausführen, wissen Sie manchmal, dass Sie feste Objekte erstellen können. Wie im obigen Beispiel für Früchte erwähnt, können Sie ein einfaches Fabrikmuster verwenden, wenn Sie bereit sind, Objekte von Früchten zu erstellen .
Oft möchten Sie jedoch keine festen Objekte erstellen, diese werden später im Programmablauf angezeigt. Die Konfiguration gibt jedoch an, welche Art von Factory Sie zu Beginn verwenden möchten. Anstatt Objekte zu erstellen, können Sie Fabriken, die von einer gemeinsamen Factory-Klasse abgeleitet sind, an den Konstruktor in IOC weitergeben.
Ich denke, es geht auch um die Lebensdauer und Erstellung des Objekts.
quelle
Beides
Factory Method
undAbstract Factory
halten die Kunden von den konkreten Typen entkoppelt. Beide erstellen Objekte, aber dieFactory
Methode verwendet die VererbungAbstract Factory
die Komposition verwendet wird.Das
Factory Method
wird in Unterklassen vererbt, um die konkreten Objekte (Produkte) zu erstellen, währendAbstract Factory
die Schnittstelle zum Erstellen der Familie verwandter Produkte und die Unterklasse dieser Schnittstelle das Erstellen verwandter Produkte definieren.Diese Unterklassen werden dann beim Instanziieren an Produktklassen übergeben, wo sie als abstrakter Typ verwendet werden. Die verwandten Produkte in einem
Abstract Factory
werden häufig mit implementiertFactory Method
.quelle
Antwort von John Feminella erweitern:
Apple
,Banana
,Cherry
ArbeitsgeräteFruitFactory
und die eine Methode aufgerufen ,Create
die die Schaffung von Apple oder Banane oder Kirsche allein verantwortlich ist. Du bist fertig mit deinerFactory
Methode.Jetzt möchten Sie
Create
einen speziellen Salat aus Ihren Früchten und da kommt Ihre abstrakte Fabrik . Abstract Factory weiß, wie man aus Apfel, Banane und Kirsche einen speziellen Salat kreiert.quelle
Per Definition können wir die Unterschiede von zwei herausziehen:
Factory: Eine Schnittstelle wird zum Erstellen eines Objekts verwendet, aber die Unterklasse entscheidet, welche Klasse instanziiert werden soll. Die Erstellung des Objekts erfolgt bei Bedarf.
Abstrakte Fabrik: Das abstrakte Fabrikmuster fungiert als Superfabrik, die andere Fabriken schafft. Im Abstract Factory-Muster ist eine Schnittstelle dafür verantwortlich, eine Reihe verwandter Objekte oder abhängiger Objekte zu erstellen, ohne deren konkrete Klassen anzugeben.
In den obigen Definitionen können wir also einen bestimmten Unterschied hervorheben. Das heißt, das Factory-Muster ist für das Erstellen von Objekten verantwortlich, und Abstract Factory ist für das Erstellen einer Reihe verwandter Objekte verantwortlich. offensichtlich beides über eine Schnittstelle.
Fabrikmuster:
Abstraktes Fabrikmuster:
quelle
Überprüfen Sie hier: http://www.allapplabs.com/java_design_patterns/abstract_factory_pattern.htm Es scheint, dass die Factory-Methode eine bestimmte Klasse (nicht abstrakt) als Basisklasse verwendet, während die Abstract-Factory eine abstrakte Klasse verwendet. Auch wenn eine Schnittstelle anstelle einer abstrakten Klasse verwendet wird, ist das Ergebnis eine andere Implementierung des Abstract Factory-Musters.
: D.
quelle
Abstract Factory ist eine Vorlage zum Erstellen verschiedener Arten von Schnittstellen. Angenommen, Sie haben ein Projekt, bei dem Sie verschiedene Arten von CSV-Dateien analysieren müssen, die mengen-, preis- und artikelspezifische Informationen enthalten, z. B. einige Daten zu Früchten, andere zu Pralinen. Nach dem Parsen müssen Sie diese Informationen in der entsprechenden Datenbank aktualisieren, damit Sie sie jetzt haben können Eine abstrakte Fabrik, die Ihnen die Parser- und Modifikatorfabrik zurückgibt, und diese Parserfabrik können Ihnen das Schokoladenparserobjekt, das Fruchtparserobjekt usw. zurückgeben. In ähnlicher Weise kann die Modifikatorfabrik das Schokoladenmodifikatorobjekt, das Fruchtmodifikatorobjekt usw. zurückgeben.
quelle
Ich denke, wir können den Unterschied zwischen diesen beiden anhand eines Java8-Beispielcodes verstehen:
Die Frage ist nun, welche Art der Erstellung Sie verwenden sollten und warum: Der erste Weg (kein Muster, nur einfacher Konstruktor): Das Erstellen selbst ist keine gute Idee, Sie müssen die ganze Arbeit erledigen und Ihr Client-Code ist daran gebunden die besondere Umsetzung.
Der zweite Weg (unter Verwendung des Factory-Musters): bietet Ihnen den Vorteil, dass Sie jede Art von Implementierung übergeben können, die je nach Bedingung unterschiedliche Arten von etwas bereitstellen kann (möglicherweise ein Parameter, der an die Erstellungsmethode übergeben wird).
Der dritte Weg (unter Verwendung des Abstract Factory-Musters): Dies gibt Ihnen mehr Flexibilität. Sie können verschiedene Arten von Erstellern von etwas finden, die auf einer bestimmten Bedingung basieren (möglicherweise wurde ein Parameter übergeben).
Beachten Sie, dass Sie mit Factory-Mustern immer durchkommen können, indem Sie zwei Bedingungen miteinander kombinieren (was die Codekomplexität und die Kopplung geringfügig erhöht). Ich denke, deshalb sehen wir selten reale Anwendungsfälle von Abstract Factory-Mustern.
quelle