Hinweis: Fragen finden Sie am Ende des Beitrags.
Ich habe die anderen Stackoverflow-Threads zu Abstract Factory vs Factory Method gelesen . Ich verstehe die Absicht jedes Musters. Die Definition ist mir jedoch nicht klar.
Die Factory-Methode definiert eine Schnittstelle zum Erstellen eines Objekts, lässt jedoch Unterklassen entscheiden, welche davon instanziiert werden sollen. Mit einer Factory-Methode können Klassen die Instanziierung auf Unterklassen verschieben.
Im Gegensatz dazu bietet eine abstrakte Factory eine Schnittstelle zum Erstellen von Familien verwandter oder abhängiger Objekte, ohne deren konkrete Klassen anzugeben.
Die Abstract Factory sieht der Factory-Methode sehr ähnlich . Ich habe einige UML-Klassen gezeichnet, um meinen Standpunkt zu veranschaulichen.
Hinweis:
- Das Diagramm stammt von www.yuml.com und ist daher nicht perfekt ausgerichtet. Aber es ist ein kostenloser Service :).
- Die Diagramme sind möglicherweise nicht perfekt. Ich lerne immer noch die GoF- Designmuster.
Fabrikmethode:
Abstrakte Fabrik (nur 1 Mitglied):
Abstract Factory (weitere Mitglieder):
Fragen:
- Wenn die Abstract Factory nur einen Schöpfer und ein Produkt hat, ist es dann immer noch das Abstract Factory- Muster? (eine Schnittstelle zum Erstellen von Familien)
- Kann der konkrete Ersteller der Factory-Methode aus einer Schnittstelle erstellt werden oder muss er aus einer Klasse stammen? (Klassen verschieben Instanziierungen auf Unterklassen)
- Wenn die Abstract Factory nur einen Ersteller und ein Produkt haben kann, besteht der einzige Unterschied zwischen der Abstract Factory und der Factory-Methode darin, dass der Ersteller für die erstere eine Schnittstelle und der Ersteller für die letztere eine Klasse ist?
Antworten:
Hoffe das hilft. Es beschreibt die verschiedenen Arten von Fabriken. Ich habe Head First Design Patterns als Referenz verwendet. Ich habe yuml.me zum Zeichnen verwendet .
Statische Fabrik
Ist eine Klasse mit einer statischen Methode zum Produzieren verschiedener Untertypen von Produkten.
Einfache Fabrik
Ist eine Klasse, die verschiedene Untertypen von Produkten erzeugen kann. (Es ist besser als die Static Factory. Wenn neue Typen hinzugefügt werden, muss die Basisproduktklasse nicht nur in der Simple Factory-Klasse geändert werden.)
Fabrikmethode
Enthält eine Methode zur Herstellung eines Produkttyps, der mit seinem Typ zusammenhängt. (Es ist besser als eine einfache Fabrik, da der Typ auf eine Unterklasse verschoben wird.)
Abstrakte Fabrik
Erzeugt eine Familie von verwandten Typen. Es unterscheidet sich deutlich von einer Factory-Methode, da es mehr als eine Art von Typen gibt, die es erzeugt. (Dies ist kompliziert. Weitere Informationen finden Sie im nächsten Diagramm.)
Beispiel aus dem .NET Framework
DbFactoriesProvider ist eine einfache Factory, da es keine Untertypen gibt. Der DbFactoryProvider ist eine abstrakte Factory, da er verschiedene verwandte Datenbankobjekte wie Verbindungs- und Befehlsobjekte erstellen kann.
.
quelle
Product
(als Zusammenfassung) und dannProduct1
undProduct2
als Söhne gäbe ? Dies würde den Punkt verbessern, dass es bei Factory Method nur darum geht, ein Produkt zu erstellen, während Abstract Factory mehr oder weniger eine Gruppe von Factory Method ist, die in Familien zusammengefasst sind.Die beiden Muster sind sicherlich verwandt!
Der Unterschied zwischen Mustern ist im Allgemeinen beabsichtigt.
Die Absicht der Factory-Methode ist "Definieren Sie eine Schnittstelle zum Erstellen eines Objekts, aber lassen Sie Unterklassen entscheiden, welche Klasse instanziiert werden soll. Mit der Factory-Methode kann eine Klasse die Instanziierung auf Unterklassen verschieben."
Die Absicht von Abstract Factory ist, "eine Schnittstelle zum Erstellen von Familien verwandter oder abhängiger Objekte bereitzustellen, ohne deren konkrete Klassen anzugeben."
Basierend auf diesen Absichtserklärungen (zitiert von GoF) würde ich sagen, dass die Factory-Methode in gewissem Sinne eine "entartete" abstrakte Factory mit einer Familie von einer ist.
Sie unterscheiden sich im Allgemeinen in der Implementierung, da die Factory-Methode viel einfacher ist als die Abstract Factory .
Sie sind jedoch auch in der Umsetzung verwandt. Wie im GoF-Buch erwähnt,
Dieses c2-Wiki bietet auch einige interessante Diskussionen zu diesem Thema.
quelle
Es scheint, dass die Liste der (ausgezeichneten) Fragen des OP ignoriert wurde. Aktuelle Antworten bieten lediglich überarbeitete Definitionen. Deshalb werde ich versuchen, die ursprünglichen Fragen kurz zu beantworten.
Nein . Eine abstrakte Fabrik muss mehr als ein Produkt erstellen, um eine "Familie verwandter Produkte" zu erstellen. Das kanonische GoF-Beispiel erstellt
ScrollBar()
undWindow()
. Der Vorteil (und Zweck) besteht darin, dass die Abstract Factory ein gemeinsames Thema für mehrere Produkte durchsetzen kann.Zunächst müssen wir beachten, dass weder Java noch C # existierten, als die GoF ihr Buch schrieb. Die GoF-Verwendung des Begriffs Schnittstelle hängt nicht mit den Schnittstellentypen zusammen, die von bestimmten Sprachen eingeführt werden. Daher kann der konkrete Ersteller aus einer beliebigen API erstellt werden. Der wichtige Punkt im Muster ist, dass die API ihre eigene Factory-Methode verwendet, sodass eine Schnittstelle mit nur einer Methode nicht mehr eine Factory-Methode sein kann als eine Abstract Factory.
Diese Frage ist nach den obigen Antworten nicht mehr gültig. Wenn Sie jedoch der Meinung sind, dass der einzige Unterschied zwischen Abstract Factory und Factory Method in der Anzahl der erstellten Produkte besteht, sollten Sie überlegen, wie ein Kunde jedes dieser Muster verwendet. Eine Abstract Factory wird normalerweise in ihren Client eingefügt und über Komposition / Delegierung aufgerufen. Eine Factory-Methode muss vererbt werden. Es kommt also alles auf die alte Debatte zwischen Komposition und Erbschaft zurück.
Aber diese Antworten haben eine vierte Frage aufgeworfen!
Wenn die Methode statisch ist, wird sie üblicherweise als statische Factory bezeichnet . Wenn die Methode nicht statisch ist, wird sie üblicherweise als Simple Factory bezeichnet . Keines davon ist ein GoF-Muster, aber in der Praxis werden sie weitaus häufiger verwendet!
quelle
Meiner Meinung nach liegt der geringfügige Unterschied zwischen den beiden Mustern in der Anwendbarkeit und damit, wie bereits gesagt, in der Absicht .
Lassen Sie uns die Definitionen zusammenfassen (beide aus Wikipedia).
Abstrakte Fabrik
Fabrikmethode
Mit beiden Mustern können die Benutzerobjekte von der Erstellung der erforderlichen Instanzen entkoppelt werden (Laufzeitentkopplung). Dies ist der gemeinsame Aspekt. Beide Muster ermöglichen es, eine Hierarchie von Fabriken entsprechend den spezifischen Anforderungen zu erstellen, und dies ist ein weiterer gemeinsamer Aspekt.
Abstract Factory ermöglicht es, mehrere verschiedene Arten von Instanzen in einer Unterklasse zu erstellen und das Erstellungsverhalten in den verschiedenen Unterklassen zu spezifizieren. Normalerweise deklariert die Factory-Methode die Erstellung nur eines Objekttyps, der gemäß dem Unterklassifizierungsmechanismus spezifiziert werden kann. Das ist der Unterschied.
Durch Zusammenfassung. Angenommen, Product definiert die Superklasse der erstellenden Objekte und ProductA und ProductB sind zwei verschiedene Unterklassen. Daher verfügt die Abstract Factory-Methode über zwei Methoden, createProductA () und createProductB (), die (in Bezug auf Erstellungsschritte) in ihren spezifischen Unterklassen spezifiziert werden: Die Factory-Unterklassen spezifizieren die Erstellungsschritte für die beiden definierten Klassen von Objekten in der Schöpfung.
Gemäß dem obigen Beispiel wird die Factory-Methode unterschiedlich implementiert, wobei die Erstellung von ProductA und ProductB in möglichst vielen Fabriken abstrahiert wird (eine Methode pro Factory), und die weitere Spezialisierung der Erstellungsschritte wird an die Hierarchie delegiert, während sie erstellt wird .
quelle
Wenn ich eine abstrahierte Factory-Klasse (auf die über eine Schnittstelle oder eine abstrakte Basisklasse verwiesen wird) erstellt habe, die Objekte erstellt, die nur eine Methode zum Erstellen von Objekten haben, wäre dies eine Factory-Methode .
Wenn die abstrahierte Factory mehr als eine Methode zum Erstellen von Objekten hätte, wäre sie eine abstrakte Factory .
Angenommen, ich erstelle einen Manager, der die Anforderungen der Aktionsmethoden für einen MVC-Controller erfüllt. Wenn es eine Methode gäbe, beispielsweise zum Erstellen der Engine-Objekte, die zum Erstellen von Ansichtsmodellen verwendet werden, wäre dies ein Factory-Methodenmuster. Wenn es dagegen zwei Methoden hätte: eine zum Erstellen von Ansichtsmodell-Engines und eine zum Erstellen von Aktionsmodell-Engines (oder wie auch immer Sie das Modell nennen möchten, das die Aktionsmethode Verbraucher enthält), wäre es eine abstrakte Factory.
quelle
Obwohl es viele Jahre her ist, dass Leute von StackOverflow in anderen Posts ähnlich zu diesem Thema befragt haben (das älteste geht bis 2009), konnte ich immer noch nicht die gewünschte Antwort finden.
Also habe ich ein paar Stunden über das Internet recherchiert, die Beispiele überprüft und bin zu dem Schluss gekommen, dass die Hauptunterschiede zwischen Abstract Factory und Factory Method bestehen
Die Gegenbeispiele wären
Wenn eine endgültige Objektgruppe ohne Ausnahme eines Objekts denselben Stil haben sollte und Sie dieses Detail "denselben Stil beibehalten" ausblenden möchten, sollten wir Abstract Factory verwenden.
quelle
Soweit ich die Bedeutung von abstrakten Factory- und Factory-Methodendefinitionen verstehe, wird die erste im statischen Kontext implementiert und liefert Objekte basierend auf Eingabeparametern.
Zweitens wird ein bereits erstelltes Objekt (die Familie) verwendet, das die Factory-Methodenschnittstelle implementiert. Die Factory-Methode erstellt dann eine bestimmte Instanz, die sich auf das ursprüngliche Objekt bezieht, unabhängig davon, um welches es sich handelt.
Dies führt normalerweise dazu, dass beide Muster zusammen verwendet werden, wobei Sie im ersten Schritt ein allgemeines Objekt erstellen, das die Familie verwandter Objekte beschreibt. Es wird von der statischen Methode getInstance ("mein Familienname") aufgerufen. Die Implementierung einer solchen getInstance-Methode entscheidet, welches Familienobjekt erstellt wird.
Dann rufe ich die Methode createProduct () für ein neu erstelltes Familienobjekt auf und abhängig vom Familienobjekt wird das neue Produkt zurückgegeben.
Es scheint, dass diese Muster zu jedem zusammenarbeiten.
Mit anderen Worten, Abstract Factory konzentriert sich auf "WAS" und die Factory-Methode "WIE" wird erstellt.
quelle
Alles, woran Sie denken müssen, ist, dass eine abstrakte Fabrik eine Fabrik ist, die mehrere Fabriken zurückgeben kann . Wenn Sie also eine AnimalSpeciesFactory hatten, kann diese Fabriken wie folgt zurückgeben:
Mamalfactory, BirdFactory, Fishfactory, ReptileFactory. Nachdem Sie eine einzelne Factory aus der AnimalSpeciesFactory haben, verwenden sie das Factory-Muster, um bestimmte Objekte zu erstellen. Stellen Sie sich zum Beispiel vor, Sie hätten eine ReptileFactory von dieser AnimalFactory und könnten dann anbieten, Reptilienobjekte wie Schlangen, Schildkröten, Eidechsenobjekte zu erstellen.
quelle
quelle
Das Factory-Methodenmuster ist ein kreatives Entwurfsmuster, das sich mit dem Erstellen von Objekten befasst, ohne die genaue Klasse des zu erstellenden Objekts anzuzeigen. Dieses Entwurfsmuster ermöglicht es einer Klasse grundsätzlich, die Instanziierung auf Unterklassen zu verschieben.
Das Abstract Factory-Muster dient zur Kapselung einer Gruppe einzelner Fabriken, ohne die konkreten Klassen freizulegen. In diesem Modell wird eine generische Schnittstelle einer abstrakten Factory-Klasse verwendet, um das erforderliche konkrete Objekt zu erstellen, das die Details der Implementierung von Objekten von ihrer Verwendung und Zusammensetzung trennt. Dieses Entwurfsmuster wird häufig in GUI-Anwendungen verwendet, in denen ähnliche GUI-Komponenten erstellt werden müssen.
Bei der Suche auf Google bin ich auf den folgenden Blog gestoßen, in dem beide Designmuster brillant erklärt wurden. Schauen Sie sich diese an
http://simpletechtalks.com/factory-design-pattern/
http://simpletechtalks.com/abstract-factory-design-pattern/
quelle