Was ist der grundlegende Unterschied zwischen Factory und Abstract Factory Patterns?
Dies ist ein Duplikat der akzeptierten Antwort und ist ebenso falsch.
Was ist der grundlegende Unterschied zwischen Factory und Abstract Factory Patterns?
Werksverfahren: Sie haben eine Fabrik, die Objekte erzeugt, die von einer bestimmten Basisklasse abgeleitet sind
Abstrakte Fabrik: Sie haben eine Fabrik, die Folgendes erzeugt andere Fabriken und diese Fabriken erstellen wiederum von Basisklassen abgeleitete Objekte. Sie tun dies, weil Sie oft nicht nur ein einzelnes Objekt erstellen wollen (wie bei der Factory-Methode), sondern eine Sammlung verwandter Objekte.
Die zweite Überschrift im Diagramm sollte lauten: "Diese beiden können sein Fabrikmethoden". Ohne die Implementierungen zu sehen, wissen wir nicht, ob sie sich an das Factory-Methoden-Muster halten oder nicht. Es ist ein weit verbreiteter Irrglaube, dass die Methoden einer abstrakten Fabrik automatisch Fabrikmethoden sind. Dies ist nicht der Fall. Es gibt nicht ohne Grund zwei verschiedene GoF-Muster: Sie werden unterschiedlich implementiert.
Viele Menschen werden sich vielleicht überrascht fühlen, aber diese Frage ist falsch . Wenn Sie diese Frage während eines Vorstellungsgesprächs hören, müssen Sie dem Gesprächspartner helfen zu verstehen, wo die Verwirrung liegt.
Gehen wir von der Tatsache aus, dass es kein konkretes Muster gibt, das nur "Factory" genannt wird. Es gibt ein Muster, das "Abstrakte Fabrik" genannt wird, und es gibt ein Muster, das "Fabrikmethode" genannt wird.
Was bedeutet also "Fabrik"? eine der folgenden Möglichkeiten (je nach Umfang des Verweises können alle als richtig angesehen werden):
Und, leider Viele Leute verwenden "Factory", um eine andere Art von Fabrik zu bezeichnen, die Fabrik oder Fabriken (oder deren Schnittstellen) erstellt. Basierend auf ihrer Theorie:
Product implementiert IProduct, das von Factory erstellt wird, das die IFactory implementiert, die von AbstractFactory erstellt wird.
Um zu verstehen, wie albern das ist, lassen Sie uns unsere Gleichung fortsetzen:
AbstractFactory implementiert IAbstractFactory, die von... erstellt wird. AbstractAbstractFactory?
Ich hoffe, Sie verstehen, worum es geht. Lassen Sie sich nicht verwirren und erfinden Sie bitte keine Dinge, die es aus gutem Grund nicht gibt.
-
P.S. : Factory für Produkte ist AbstractFactory, und Factory für abstrakte Fabriken wäre nur ein weiteres Beispiel für AbstractFactory.
Wie kann ich AbstractFactory, das andere AbstractFactories erstellt, von AbstractFactory, das bestimmte Objekte erstellt, unterscheiden? GenericAbstractFactory? Oder AbstractFactoryFactory?
Bei den Entwurfsmustern gibt es so etwas nicht. Beide sind Instanzen des AbstractFactory-Musters. Eine AbstractFactory erzeugt also bestimmte Objekte, und eine andere AbstractFactory erzeugt Fabriken (die wiederum AbstractFactory sind).
Klar. Wie benenne ich also diese Klassen, die unterschiedliche Aufgaben haben? Denn das Erstellen anderer Fabriken und das Erstellen anderer (einfacher) Objekte sind zwei verschiedene Dinge. Ich kümmere mich nicht um Muster, ich brauche lesbaren Code.
Beispiel/Szenario für abstrakte Fabrik
Ich lebe an einem Ort, an dem es in der Regenzeit regnet, im Winter schneit und im Sommer heiß und sonnig ist. Ich brauche verschiedene Arten von Kleidung, um mich vor den Elementen zu schützen. Deshalb gehe ich in ein Geschäft in der Nähe meines Hauses und frage nach Kleidung, um mich zu schützen. Der Ladenbesitzer gibt mir je nach Umgebung und Geldbeutel die passenden Artikel. Die Artikel, die er mir gibt, sind von gleicher Qualität und Preisklasse. Da er meine Ansprüche kennt, fällt es ihm leicht, das zu tun. Aber wenn ein reicher Mann von der anderen Straßenseite mit den gleichen Anforderungen kommt, bekommt er einen teuren Markenartikel. Auffällig ist, dass sich alle Artikel, die er mir schenkt, in Bezug auf Qualität, Standard und Preis ergänzen. Man kann sagen, sie passen zueinander. Das Gleiche gilt für die Artikel, die dieser reiche Mann bekommt.
Wenn ich mir das oben beschriebene Szenario ansehe, weiß ich die Effizienz des Ladenbesitzers zu schätzen. Ich kann diesen Ladenbesitzer durch einen abstrakten Laden ersetzen. Die Artikel erhalten wir mit abstrakten Artikeln und ich und die Reichen als perspektivische Kunden. Alles, was wir brauchen, ist das Produkt/der Artikel, der unseren Bedürfnissen entspricht.
Jetzt kann ich mir gut vorstellen, ein Online-Geschäft in Betracht zu ziehen, das seinen zahlreichen Kunden eine Reihe von Dienstleistungen anbietet. Jeder Kunde gehört zu einer der drei Gruppen. Wenn ein Benutzer der Premium-Gruppe die Website öffnet, erhält er eine großartige Benutzeroberfläche, einen stark angepassten Werbebereich, mehr Optionen in den Menüs usw. Der Gold-Nutzer erhält dieselben Funktionen, aber die Funktionalität des Menüs ist geringer, die Werbung ist meist relevant und die Benutzeroberfläche ist weniger ergonomisch. Der letzte ist meine Art von Nutzer, ein Nutzer der "freien Gruppe". Ich werde gerade so viel bedient, dass ich nicht beleidigt bin. Die Benutzeroberfläche ist ein absolutes Minimum, die Werbung ist so abwegig, dass ich nicht weiß, was sie enthält, und schließlich gibt es im Menü nur eine Abmeldemöglichkeit.
Wenn ich die Chance bekomme, etwas wie diese Website zu erstellen, würde ich auf jeden Fall das Abstract Factory Pattern in Betracht ziehen.
Abstrakte Produkte : Werbefenster, Menü, UI Maler.
Abstrakte Fabrik : Benutzererfahrung im Webshop
Betonfabrik: Premium User Experience, Gold User Experience, General User Experience.
//Abstract factory - Provides interface to create factory of related products
interface PizzaIngredientsFactory{
public Dough createDough(); //Will return you family of Dough
public Clam createClam(); //Will return you family of Clam
public Sauce createSauce(); //Will return you family of Sauce
}
class NYPizzaIngredientsFactory implements PizzaIngredientsFactory{
@Override
public Dough createDough(){
//create the concrete dough instance that NY uses
return doughInstance;
}
//override other methods
}
Die Definitionen aus dem Lehrbuch sind bereits in anderen Antworten enthalten. Ich dachte, ich würde auch ein Beispiel dafür geben.
Hier also die PizzaIngredientsFactory
ist ein abstrakte Fabrik da es Methoden zur Erstellung von Familien verwandter Produkte bietet.
Beachten Sie, dass jede Methode in der abstrakten Fabrik eine Fabrik-Methode an sich. Wie createDough()
ist an sich eine Fabrikmethode, deren konkrete Implementierungen von Unterklassen geliefert werden, wie NYPizzaIngredientsFactory
. Auf diese Weise kann jeder Standort Instanzen konkreter Zutaten erstellen, die zu seinem Standort gehören.
Bietet eine Instanz der konkreten Implementierung
In diesem Beispiel:
- createDough()
- bietet eine konkrete Umsetzung für Teig. Dies ist also eine Fabrikmethode
Bietet eine Schnittstelle zur Erstellung von Familien verwandter Objekte
In diesem Beispiel:
- PizzaIngredientsFactory
ist eine abstrakte Fabrik, die es ermöglicht, eine zusammenhängende Menge von Objekten zu erstellen wie Dough
, Clams
, Sauce
. Für die Erstellung jeder Familie von Objekten gibt es eine Fabrikmethode.
Beispiel aus Head First Entwurfsmuster
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.
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.