2010-02-17 13 views
101

Die meisten der Definition sagen:Warum brauchen wir abstrakte Fabrik Design Muster?

Ein abstraktes Werk stellt eine Schnittstelle für

ohne Angabe ihre konkreten Klassen Familien verwandte Objekte zu schaffen

Was die Verwendung von Abstrakte Fabrik, wie wir ist kann die Aufgabe über das Erstellen des Objekts der konkreten Klasse selbst erreichen. Warum haben wir eine Factory-Methode, die ein Objekt der Concrete-Klasse erstellt?

Bitte geben Sie mir ein Beispiel aus dem wirklichen Leben, in dem ich abstractFactory-Muster implementieren muss?

Antwort

1

Wenn Sie die Entwurfsmuster betrachten, können fast alle von ihnen überflüssig gemacht werden. Aber welches Muster bedeutet einen allgemein verwendeten Ansatz für eine Lösung für eine ähnliche Art von Problemen. Ein Entwurfsmuster bietet Ihnen einen Ansatz oder eine Lösung auf Designebene für eine Reihe ähnlicher Entwurfsfehler. Mithilfe von Entwurfsmustern können Sie Ihr Problem lösen und somit schneller liefern.

3

Wenn ich Sie richtig verstehe - die Frage ist, warum haben wir sowohl die Factory-Methode und die abstrakte Fabrik Muster. Sie benötigen abstrakte Factory, wenn verschiedene polymorphe Klassen unterschiedliche Instantiierungsverfahren hat. Und Sie möchten, dass ein Modul Instanzen erstellt und diese verwendet, ohne dass Sie Details zur Objektinitialisierung kennen. Zum Beispiel - Sie möchten Java-Objekte erstellen, die einige Berechnungen durchführen. Aber einige von ihnen sind Teil der Anwendung, während andere Bytecode aus der DB gelesen werden sollte. Auf der anderen Seite - warum brauchen wir Fabrik Methode? Stimme zu, dass die abstrakte Fabrik sie überschneidet. Aber in einigen Fällen - es ist viel weniger Code zu schreiben, weniger Klassen und Schnittstellen zu haben macht System leichter zu verstehen.

203
+5

Alle diese Beispiele beschreiben das Factory Method Pattern, da alle eine einzelne Produktschnittstelle zurückgeben. Keines davon ist ein Abstraktes Fabrikmuster, weil keines von ihnen eine Familie verwandter Produktschnittstellen erzeugt. – jaco0646

+15

Im Interesse einer vollständigen Offenlegung sollte der Autor dieser Antwort klargestellt haben, dass er auch der Autor jeder der verknüpften Antworten ist; also ist diese Liste ** NICHT ** eine repräsentative Stichprobe aus der SO-Community. – jaco0646

+1

@ jaco0646 IIRC, das [Factory Method Pattern] (https://en.wikipedia.org/wiki/Factory_method_pattern) ist eine Spezialisierung des [Template Method pattern] (https://en.wikipedia.org/wiki/Template_method_pattern)), die auf Vererbung beruht. Ich mag mich jedoch irren, da ich gerade reise und mein GoF-Buch nicht bei mir habe. Was meinen Sie mit "keiner von ihnen produziert eine Familie verwandter Produktschnittstellen"? –

22

Ein richtiges Beispiel für die Verwendung der Abstrakte Fabrik bietet Datenzugriff zu zwei verschiedenen Datenquellen (z.B. eine SQL-Datenbank und eine XML-Datei). Sie haben zwei verschiedene Datenzugriffsklassen (ein Gateway zum Datenspeicher). Beide erben von einer Basisklasse, die die allgemein zu implementierenden Methoden definiert (z. B. Laden, Speichern, Löschen).

Welche Datenquelle verwendet werden soll, sollte nicht die Art ändern, in der Client-Code seine Datenzugriffsklasse abruft. Ihre Abstract Factory weiß, welche Datenquelle verwendet werden soll und gibt auf Anfrage eine entsprechende Instanz zurück. Die Factory gibt diese Instanz als Basisklassentyp zurück.

+11

Diese Antwort könnte das Factory-Method-Muster oder das statische Factory-Muster, aber nicht das abstrakte Factory-Muster genau beschreiben. – jaco0646

1

Es ist einfach, Abbildung, dass Sie einen Code haben, der mit der Abstraktion arbeitet, sollten Sie Abstraktionen und nicht konkrete Klassen erstellen.

Sie sollten immer gegen Abstraktionen arbeiten, weil Sie den Code besser ändern können.

Dies ist ein gutes Beispiel: http://en.wikipedia.org/wiki/Abstract_factory_pattern#C.23

0

Ich finde die Abstrakte Fabrik hoch genug.

Zunächst einmal ist es nicht passieren, dass oft vor, dass Sie eine Reihe von miteinander Typen haben Sie instanziiert werden soll.

Zweitens, die Ebene der Indirektion (Abstraktion) von Schnittstellen reicht normalerweise aus, wenn mit Abhängigkeitsinjektion gearbeitet wird.

Das typische Beispiel für WindowsGui vs MacGui vs ... wo Sie eine WindowsButton haben würde, MacButton, WindowsScrollBar, MacScrollbar usw. ist oft einfacher zu implementieren durch die Definition Beton Buttons, Scrollbars usw. mit Besucher- und/oder Interpreter-Muster, um das tatsächliche Verhalten zu liefern.

+0

Theres einen bestimmten Zweck dafür. Mit Abhängigkeitsinjektion möchten Sie Service-Locators nicht weiter unten von der zusammengesetzten Wurzel. Stattdessen verwenden Sie eine injizierte abstrakte Fabrik. –

+2

gut ... mit Service-Locator mit DI ist ein Anti-Patteren. Eine abstrakte Factory ist die universelle Lösung, wenn wir DEPENDENCIES aus Laufzeitwerten erstellen müssen. – TheMentor

0

Um Ihre Frage direkt zu beantworten, können Sie wahrscheinlich ohne ein solches Designmuster wegkommen.

Bedenken Sie jedoch, dass sich die meisten Projekte in der realen Welt entwickeln und Sie eine gewisse Erweiterbarkeit bereitstellen möchten, um Ihr Projekt zukunftssicher zu machen.

Aus meiner eigenen Erfahrung wird meistens eine Factory implementiert und wenn das Projekt wächst, wird es in komplexere Entwurfsmuster wie eine abstrakte Fabrik umgewandelt.

2

Abstract Factories eignen sich hervorragend, um mehrere Plattformen zu unterstützen und gleichzeitig die Code-Basis einheitlich zu halten. Angenommen, Sie haben ein großes Qt- oder GTK + - oder .NET/Mono-Programm, das Sie unter Windows, Linux und OSX ausführen möchten. Aber Sie haben eine Funktion, die auf jeder Plattform anders implementiert ist (vielleicht über die kernel32-API oder eine POSIX-Funktion).

public abstract class Feature 
{ 
    public abstract int PlatformSpecificValue { get; } 

    public static Feature PlatformFeature 
    { 
     get 
     { 
      string platform; 
      // do platform detection here 
      if (platform == "Win32") 
       return new Win32Feature(); 
      if (platform == "POSIX") 
       return new POSIXFeature(); 
     } 
    } 

    // platform overrides omitted 
} 

Mit dieser abstrakten Factory muss Ihre Benutzeroberfläche nichts über die aktuelle Plattform wissen.

Feature feature = Feature.PlatformFeature; 
Console.WriteLine(feature.PlatformSpecificValue); 
0

Es geht um Abhängigkeiten. Wenn Sie sich nicht um enge Kopplung und Abhängigkeiten kümmern, brauchen Sie keine abstrakte Fabrik. Aber es wird wichtig sein, sobald Sie eine Anwendung schreiben, die Wartung benötigt.

0

Angenommen, Sie erstellen a.jar, und jemand anderes verwendet Ihr jar und möchte ein neues konkretes Objekt in Ihrem Code verwenden. Wenn Sie keine abstrakte Fabrik verwenden, muss sie Ihren Code ändern oder Ihren Code überschreiben. Aber wenn Sie abstrakte Fabrik verwenden, dann kann sie eine Fabrik zur Verfügung stellen und an Ihren Code übergeben und alles ist in Ordnung.

Raffinierte Version: Betrachten Sie das folgende Szenario: Jemand anderes schrieb ein Framework. Das Framework verwendet eine abstrakte Fabrik und einige konkrete Fabriken, um zur Laufzeit viele Objekte zu erstellen. So können Sie einfach Ihre eigene Factory im vorhandenen Framework registrieren und eigene Objekte erstellen. Der Rahmen ist für Modifikationen geschlossen und aufgrund des abstrakten Fabrikmusters noch leicht zu erweitern.

+0

Können Sie bitte genauer führen? –

+0

aktualisiert, hoffe es ist besser –

3

Was ist die Verwendung von Abstract Factory Pattern, da wir die Aufgabe über das Erstellen von Objekt der konkreten Klasse selbst erreichen können. Warum haben wir eine Factory-Methode, die ein Objekt der Concrete-Klasse erstellt?

In Abwesenheit von Abstract Factory, müssen Kundendaten von konkreten Klassen kennen. Diese feste Verbindung wurde mit Abstract Factory entfernt.

Jetzt Factory-Methode macht einen Vertrag, den Client verwenden muss. Sie können Ihrer Fabrik weitere Produkte hinzufügen, indem Sie neue Produkte hinzufügen, die die Schnittstelle implementieren, die von der Factory-Methode verfügbar gemacht wird.

für ein besseres Verständnis dieser Zusammenhang SE Fragen Siehe:

What is the basic difference between the Factory and Abstract Factory Patterns?

Absichten:

eine Schnittstelle bereitstellen, für Familien von verwandten oder abhängigen Objekte zu schaffen, ohne ihre konkreten Klassen angeben.

Sie können Intent, Struktur verstehen, Checkliste und Faustregeln von Abstract Factory Muster aus diesem sourcemaking Artikel.

Prüfliste:

  1. Entscheiden Sie, ob Plattformunabhängigkeit und Schaffung Dienste die aktuelle Quelle des Schmerzes sind.
  2. Ordnen Sie eine Matrix von Plattformen gegenüber Produkte.
  3. Definieren Sie eine Factory-Schnittstelle, die aus einer Factory-Methode pro Produkt besteht.
  4. Definieren Sie eine Factory abgeleitete Klasse für jede Plattform, die alle Verweise auf den neuen Operator einkapselt.
  5. Der Client sollten alle Verweise auf neue Rente gehen, und verwenden Sie die Fabrikmethoden die Produkt Objekte zu erstellen.
0

Dieses Muster ist besonders nützlich, wenn der Kunde nicht genau weiß, welche Art zu erstellen. Nehmen wir an, ein Showroom , der ausschließlich Mobiltelefone verkauft, erhält eine Anfrage für die Smartphones von Samsung. Hier kennen wir nicht den genauen Typ des zu erstellenden Objekts (vorausgesetzt, dass alle Informationen für ein Telefon in der Form eines konkreten Objekts verpackt sind). Aber wir wissen, dass wir nach Smartphones suchen, die von Samsung hergestellt werden. Diese Information kann tatsächlich verwendet werden, wenn unser Entwurf abstrakte Fabrikimplementierung hat.

Understanding and Implementing Abstract Factory Pattern in C#

0

Ich denke, es ist ein Ort für Abstrakte Fabrik ist eher als eine einfache Fabrik Muster an Orten, wo Ihre instantiations sehr kompliziert sind, zu kompliziert und hässlich für eine einzelne Fabrik und zu kompliziert für die Benutzeroberfläche zu verstehen.

Sagen wir, das ist eine Marke TYPE_A nicht eine einzige Klasse .. sagen wir mal, es gibt eine Familie von 100 Arten von ähnlichen Klassen von Typ-A und Sie müssen ein Objekt von ihnen instanziieren. Stellen Sie sich vor, Sie benötigen eine detaillierte Information, um das richtige Objekt aus einer Marke vieler ähnlicher Objekte zu machen. In dieser Objekteinheit müssen Sie genau wissen, welche Parameter Sie einstellen und wie Sie sie abstimmen.

In der speziellen Fabrik für diese Marke werden wir sie differenzieren und das genaue Objekt zur Instanziierung und auch zur Instanziierung bekommen. wir werden das anhand der Eingabe aus dem Netz (sagen wir mal, welche Farbe im Online-Shop verfügbar ist) und von anderen Anwendungen und Diensten, die im Hintergrund ausgeführt werden, kennen (Parameter, die der Benutzeroberfläche nicht bekannt sind).

Und vielleicht morgen haben wir eine andere Familie von sagen wir type_B und type_C instanziieren. So die UI wird die "wenn sonst" zu wissen, ob der Benutzer ein "type_A", "type_B" oder "type_C" wollen - aber die Fabriken Klassen werden genau entscheiden, welche Klasse aus dem Typ (aus der Familie) zu bauen, und wie man es stimmt - welche Werte man auf seine Parameter einstellt oder an seinen Auftragnehmer sendet. All dies - gemäß vielen Parametern, die der Benutzeroberfläche nicht bekannt sind. All dies wird für eine einzelne Fabrikklasse zu viel sein.