Der größte Teil der Definition lautet:
Eine abstrakte Factory bietet eine Schnittstelle zum Erstellen von Familien verwandter Objekte, ohne deren konkrete Klassen anzugeben
Was ist die Verwendung von Abstract Factory Pattern, um die Aufgabe durch Erstellen eines Objekts der konkreten Klasse selbst zu erreichen? Warum haben wir eine Factory-Methode, die Objekte der Concrete-Klasse erstellt?
Bitte geben Sie mir ein Beispiel aus dem wirklichen Leben, in dem ich abstractFactory-Muster implementieren muss.
Ein reales Beispiel für die Verwendung des Abstract Factory-Musters ist der Datenzugriff auf zwei verschiedene Datenquellen. Angenommen, Ihre Anwendung unterstützt verschiedene Datenspeicher. (zB eine SQL-Datenbank und eine XML-Datei). Sie haben zwei verschiedene Datenzugriffsschnittstellen, z. B. eine
IReadableStore
undIWritableStore
die von Ihrer Anwendung erwarteten allgemeinen Methoden, unabhängig von der Art der verwendeten Datenquelle.Welche Art von Datenquelle verwendet werden soll, sollte die Art und Weise, wie Client-Code seine Datenzugriffsklassen abruft, nicht ändern. Sie
AbstractDataAccessFactory
wissen, welcher Datenquellentyp konfiguriert ist, und stellen eine konkrete Factory für den Clientcode bereit , dhSqlDataAccessFactory
oderXmlDataAccessFactory
. Diese konkreten Fabriken können die konkreten Implementierungen erstellen, z . B.SqlReadableStore
undSqlWriteableStore
.Die DbProviderFactory in .NET Framework ist ein Beispiel für dieses Muster.
quelle
Wenn ich Sie richtig verstehe, ist die Frage, warum wir sowohl die Factory-Methode als auch die abstrakten Factory-Muster haben. Sie benötigen eine abstrakte Factory, wenn verschiedene polymorphe Klassen unterschiedliche Instanziierungsverfahren haben. Sie möchten, dass ein Modul Instanzen erstellt und verwendet, ohne Details zur Objektinitialisierung zu kennen. Beispiel: Sie möchten Java-Objekte erstellen, die einige Berechnungen durchführen. Einige von ihnen sind jedoch Teil der Anwendung, während der Bytecode anderer aus der Datenbank gelesen werden sollte. Auf der anderen Seite - warum brauchen wir eine Fabrikmethode? Stimmen Sie zu, dass diese abstrakte Fabrik sie überlappt. In einigen Fällen ist das Schreiben von Code jedoch viel weniger, da weniger Klassen und Schnittstellen das System leichter verständlich machen.
quelle
In Abwesenheit von Abstract Factory muss der Kunde Details zu konkreten Klassen kennen. Diese dichte Kupplung wurde mit der Abstract Factory entfernt .
Jetzt legt die Factory-Methode einen Vertrag offen, den der Kunde verwenden muss. Sie können Ihrer Fabrik weitere Produkte hinzufügen, indem Sie neue Produkte hinzufügen, die die von der Factory-Methode bereitgestellte Schnittstelle implementieren.
Beziehen Sie sich zum besseren Verständnis auf diese verwandten SE-Fragen:
Was ist der grundlegende Unterschied zwischen dem Factory- und dem Abstract Factory-Muster?
Absicht:
Sie können die Absicht, Struktur, Checkliste und Faustregeln des Abstract Factory- Musters aus diesem Artikel zur Quellenherstellung verstehen .
Checkliste:
quelle
Abstrakte Fabriken eignen sich hervorragend zur Unterstützung mehrerer Plattformen und zur Vereinheitlichung Ihrer Codebasis. Angenommen, Sie haben ein großes Qt- oder GTK + - oder .NET / Mono-Programm, das Sie unter Windows, Linux und OSX ausführen möchten. Sie haben jedoch eine Funktion, die auf jeder Plattform unterschiedlich implementiert ist (möglicherweise über die Kernel32-API oder eine POSIX-Funktion).
Mit dieser Abstract Factory muss Ihre Benutzeroberfläche nichts über die aktuelle Plattform wissen.
quelle
Wenn Sie sich die Entwurfsmuster ansehen, können fast alle überflüssig gemacht werden. Aber welches Muster bedeutet einen häufig verwendeten Ansatz zur Lösung einer ähnlichen Art von Problemen? Ein Entwurfsmuster bietet Ihnen einen Ansatz oder eine Lösung auf Entwurfsebene für eine Reihe ähnlicher Entwurfsprobleme. Mithilfe von Entwurfsmustern können Sie Ihr Problem lösen und somit schneller liefern.
quelle
Wenn Sie sich vorstellen, dass Sie einen Code haben, der mit der Abstraktion funktioniert, sollten Sie Abstraktionen und keine konkreten Klassen erstellen.
Sie sollten immer gegen Abstraktionen arbeiten, da Sie den Code besser ändern können.
Dies ist ein gutes Beispiel: http://en.wikipedia.org/wiki/Abstract_factory_pattern#C.23
quelle
Ich finde das Abstract Factory-Muster überbewertet.
Erstens kommt es nicht so oft vor, dass Sie eine Reihe miteinander verbundener Typen haben, die Sie instanziieren möchten.
Zweitens reicht normalerweise die von Schnittstellen bereitgestellte Indirektionsebene (Abstraktion) aus, wenn mit Abhängigkeitsinjektion gearbeitet wird.
Das typische Beispiel für WindowsGui vs MacGui vs ..., bei dem Sie einen WindowsButton, MacButton, WindowsScrollBar, MacScrollbar usw. haben, ist häufig einfacher zu implementieren, indem Sie konkrete Schaltflächen, Bildlaufleisten usw. mithilfe des Visitor- und / oder Interpreter-Musters definieren tatsächliches Verhalten.
quelle
Ich denke, es gibt einen Ort für abstrakte Fabrikmuster anstelle von einfachen Fabrikmustern an Orten, an denen Ihre Instanziierungen sehr kompliziert, zu kompliziert und hässlich für eine einzelne Fabrik und zu kompliziert für die Benutzeroberfläche sind.
Angenommen, dies ist eine Marke von TYPE_A, keine einzelne Klasse. Angenommen, es gibt eine Familie von 100 ähnlichen Klassen vom Typ A, und Sie müssen ein Objekt aus ihnen instanziieren. Stellen Sie sich vor, es sind detaillierte Informationen erforderlich, um aus einer Marke vieler ähnlicher Objekttypen das richtige Objekt zu machen. In dieser Objektentität müssen Sie genau wissen, welche Parameter zu optimieren sind und wie sie zu optimieren sind.
In der speziellen Fabrik für diese Marke werden wir sie differenzieren lassen und das genaue Objekt zum Instanziieren und auch zum Instanziieren erhalten. Wir werden wissen, dass aufgrund von Eingaben aus dem Netz (sagen wir, welche Farbe im Online-Shop verfügbar ist) und von anderen Anwendungen und Diensten, die im Hintergrund ausgeführt werden (Parameter, die der Benutzeroberfläche nicht bekannt sind).
Und vielleicht haben wir morgen eine andere Familie von Typ_B und Typ_C zum Instanziieren. Die Benutzeroberfläche hat also das "Wenn sonst", um zu wissen, ob der Benutzer einen "Typ_A", "Typ_B" oder "Typ_C" möchte - aber die Fabrikklassen entscheiden genau, welche Klasse aus dem Typ (aus der Familie) erstellt werden soll, und wie man es abstimmt - welche Werte auf seine Parameter eingestellt oder an seinen Auftragnehmer gesendet werden sollen. All dies - nach vielen Parametern, die der Benutzeroberfläche nicht bekannt sind. All dies wird für eine einzelne Fabrikklasse zu viel sein.
quelle
Um Ihre Frage direkt zu beantworten, können Sie wahrscheinlich ohne ein solches Entwurfsmuster davonkommen.
Bedenken Sie jedoch, dass sich die meisten Projekte in der realen Welt weiterentwickeln und Sie eine Art Erweiterbarkeit bereitstellen möchten, um Ihr Projekt zukunftssicher zu machen.
Aus eigener Erfahrung wird meistens eine Fabrik implementiert, und wenn das Projekt wächst, wird es in komplexere Entwurfsmuster wie eine abstrakte Fabrik umgewandelt.
quelle
Es geht nur um Abhängigkeiten. Wenn Sie sich nicht für enge Kopplungen und Abhängigkeiten interessieren, brauchen Sie keine abstrakte Factory. Es ist jedoch wichtig, sobald Sie eine Anwendung schreiben, die gewartet werden muss.
quelle
Angenommen, Sie erstellen ein Glas, und jemand anderes verwendet Ihr Glas und möchte ein neues konkretes Objekt in Ihrem Code verwenden. Wenn Sie keine abstrakte Factory verwenden, muss sie Ihren Code ändern oder Ihren Code überschreiben. Wenn Sie jedoch eine abstrakte Fabrik verwenden, kann sie eine Fabrik bereitstellen und an Ihren Code übergeben, und alles ist in Ordnung.
Verfeinerte Version: Betrachten Sie das folgende Szenario: Jemand anderes hat ein Framework geschrieben. Das Framework verwendet eine abstrakte Factory und einige konkrete Fabriken, um zur Laufzeit viele Objekte zu erstellen. So können Sie ganz einfach Ihre eigene Factory im vorhandenen Framework registrieren und Ihre eigenen Objekte erstellen. Das Framework ist für Änderungen geschlossen und aufgrund des abstrakten Factory-Musters immer noch leicht zu erweitern.
quelle
Grundlegendes zum abstrakten Factory-Muster in C #
quelle
Ein reales Beispiel finden Sie im System.Data.Common-Namespace mit abstrakten Basisklassen wie DbConnection, DbCommand und DbDataAdapter, die von den .NET Framework-Datenanbietern wie System.Data.SqlClient und System.Data.OracleClient gemeinsam genutzt werden Ermöglichen Sie einem Entwickler, generischen Datenzugriffscode zu schreiben, der nicht von einem bestimmten Datenanbieter abhängt.
Die DbProviderFactories-Klasse bietet statische Methoden zum Erstellen einer DbProviderFactory-Instanz. Die Instanz gibt dann ein korrektes stark typisiertes Objekt zurück, das auf Providerinformationen und der zur Laufzeit angegebenen Verbindungszeichenfolge basiert.
Beispiel:
Beispiel-2
Code Solution-Architektur
Konkrete Factory-Instanzen werden mithilfe der folgenden statischen Factory-Methode bereitgestellt
quelle