Ich habe Designmuster von einer Website gelesen
Dort habe ich über Factory, Factory-Methode und Abstract Factory gelesen, aber sie sind so verwirrend, dass die Definition nicht klar ist. Nach Definitionen
Factory - Erstellt Objekte, ohne die Instanziierungslogik dem Client zur Verfügung zu stellen, und verweist über eine gemeinsame Schnittstelle auf das neu erstellte Objekt. Ist eine vereinfachte Version der Factory-Methode
Factory-Methode - Definiert eine Schnittstelle zum Erstellen von Objekten, lässt jedoch Unterklassen entscheiden, welche Klasse instanziiert werden soll, und verweist über eine gemeinsame Schnittstelle auf das neu erstellte Objekt.
Abstract Factory - Bietet die Schnittstelle zum Erstellen einer Familie verwandter Objekte, ohne deren Klassen explizit anzugeben.
Ich habe mir auch die anderen Stackoverflow-Threads in Bezug auf Abstract Factory vs Factory Method angesehen, aber die dort gezeichneten UML-Diagramme machen mein Verständnis noch schlimmer.
Kann mir bitte jemand sagen
- Wie unterscheiden sich diese drei Muster voneinander?
- Wann welche verwenden?
- Und wenn möglich auch Java-Beispiele zu diesen Mustern?
quelle
Antworten:
Alle drei Factory-Typen machen dasselbe: Sie sind ein "intelligenter Konstruktor".
Angenommen, Sie möchten zwei Obstsorten herstellen können: Apfel und Orange.
Fabrik
Factory ist "behoben", da Sie nur eine Implementierung ohne Unterklasse haben. In diesem Fall haben Sie eine Klasse wie diese:
Anwendungsfall: Das Konstruieren eines Apple oder eines Orange ist etwas zu komplex, um es im Konstruktor zu verarbeiten.
Fabrikmethode
Die Factory-Methode wird im Allgemeinen verwendet, wenn Sie eine generische Verarbeitung in einer Klasse haben, aber variieren möchten, welche Art von Obst Sie tatsächlich verwenden. So:
... dann können Sie die allgemeine Funktionalität in wiederverwenden,
FruitPicker.pickFruit()
indem Sie eine Factory-Methode in Unterklassen implementieren:Abstrakte Fabrik
Abstract Factory wird normalerweise für Dinge wie Abhängigkeitsinjektion / -strategie verwendet, wenn Sie in der Lage sein möchten, eine ganze Familie von Objekten zu erstellen, die "der gleichen Art" sein müssen und einige gemeinsame Basisklassen haben. Hier ist ein vage fruchtbezogenes Beispiel. Der Anwendungsfall hier ist, dass wir sicherstellen möchten, dass wir nicht versehentlich einen OrangePicker auf einem Apple verwenden. Solange wir unsere Obst- und Pflücker aus derselben Fabrik beziehen, werden sie zusammenpassen.
quelle
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 Entwurfsmuster der Factory-Methode die Vererbung verwendet und zum Erstellen des Objekts auf abgeleiteten Klassen oder Unterklassen basiert
Factory: Der Kunde benötigt nur eine Klasse und kümmert sich nicht darum, welche konkrete Implementierung er erhält.
Factory-Methode: Der Client weiß nicht, welche konkreten Klassen zur Laufzeit erstellt werden müssen, sondern möchte nur eine Klasse erhalten, die die Aufgabe übernimmt.
AbstactFactory: Wenn Ihr System mehrere Produktfamilien erstellen muss oder Sie eine Produktbibliothek bereitstellen möchten, ohne die Implementierungsdetails offenzulegen.
Abstract Factory-Klassen werden häufig mit der Factory-Methode implementiert. Factory-Methoden werden normalerweise in Template-Methoden aufgerufen.
Factory und FactoryMethod
Absicht:
Definieren Sie eine Schnittstelle zum Erstellen eines Objekts, lassen Sie jedoch Unterklassen entscheiden, welche Klasse instanziiert werden soll. Mit der Factory-Methode kann eine Klasse die Instanziierung auf Unterklassen verschieben.
UML-Diagramm :
Produkt: Definiert eine Schnittstelle der Objekte, die die Factory-Methode erstellt.
ConcreteProduct: Implementiert die Produktschnittstelle
Ersteller: Deklariert die Factory-Methode
ConcreateCreator: Implementiert die Factory-Methode, um eine Instanz eines ConcreteProduct zurückzugeben
Problemstellung: Erstellen Sie eine Factory of Games mithilfe von Factory-Methoden, die die Spieloberfläche definieren.
Code-Auszug:
Fabrikmuster. Wann werden Werksmethoden angewendet?
Vergleich mit anderen Schöpfungsmustern:
Das Design beginnt mit der Factory-Methode (weniger kompliziert, anpassbarer, Unterklassen vermehren sich) und entwickelt sich zu Abstract Factory, Prototype oder Builder (flexibler, komplexer), wenn der Designer feststellt, wo mehr Flexibilität erforderlich ist
Abstract Factory- Klassen werden häufig mit Factory-Methoden implementiert , können jedoch auch mit Prototype implementiert werden
Referenzen zur weiteren Lektüre: Sourcemaking Design-Patterns
quelle
Factory - Separate Factory-Klasse zum Erstellen komplexer Objekte.
Beispiel: FruitFactory-Klasse zum Erstellen eines Objekts von Fruit
Factory-Methode - Fügen Sie anstelle einer vollständigen separaten Klasse für die Factory nur eine Methode in dieser Klasse selbst als Factory hinzu.
Ex:
Abstrakte Fabrikmethode - Fabrik der Fabrik
Beispiel: Nehmen wir an, wir wollen eine Fabrik für Computerteile bauen. Es gibt also verschiedene Arten von Computern wie Laptop, Desktop, Server.
Für jeden Computertyp benötigen wir also eine Fabrik. Also schaffen wir eine Fabrik auf hoher Ebene mit Fabriken wie unten
Jetzt sind diese 3 selbst wieder Fabriken. (Sie werden sich mit PartFactory selbst befassen, aber unter der Haube wird es eine separate Implementierung geben, die auf dem basiert, was Sie in der abstrakten Factory bereitgestellt haben.)
BEARBEITEN: bearbeitet, um genaue Schnittstellen für Abstract Factory gemäß den Einwänden in den Kommentaren bereitzustellen.
quelle
ComputerFactory
wäre, dass Sie eine gemeinsame Erstellungsoberfläche haben (getScreen(); getKeyboard(); getDiskdrive(); ...
) haben, keine Schnittstelle pro Computertyp, wie Sie vorschlagen. Sie können ein Designproblem riechen, wenn Sie dasselbe Wort zweimal in derselben Anweisung verwenden: Laptop Factory.get Laptop Part ().abstract Factory
ist keine Fabrik der Fabrik ... Es ist einabstract class
oder eininterface
fähiges Objekt, das mit verschiedenen konkreten Fabriken implementiert / erweitert wird. Code-Details finden Sie in der akzeptierten Antwort. Und bitte entfernen oder bearbeiten Sie Ihre Antwort entsprechend.Jedes Entwurfsmuster trägt dazu bei, dass geschriebener Arbeitscode nicht berührt wird. Wir alle wissen, dass es nach dem Berühren des Arbeitscodes Fehler in den vorhandenen Arbeitsabläufen gibt und dass noch viel mehr Tests durchgeführt werden müssen, um sicherzustellen, dass wir nichts kaputt machen.
Ein Factory-Muster erstellt Objekte basierend auf Eingabekriterien und stellt so sicher, dass Sie keinen Code schreiben müssen, wie dies der Fall ist. Erstellen Sie dann dieses Objekt oder dieses Objekt. Ein gutes Beispiel dafür ist eine Reise-Website. Eine Reise-Website kann nur Reisen (Flug, Zug, Bus) oder / und Hotels oder / und Touristenattraktionspakete anbieten. Wenn ein Benutzer als Nächstes auswählt, muss die Website entscheiden, welche Objekte erstellt werden sollen. Sollte es auch nur das Reise- oder Hotelobjekt erstellen.
Wenn Sie sich nun vorstellen, Ihrem Portfolio eine weitere Website hinzuzufügen, und Sie der Meinung sind, dass derselbe Kern verwendet wird, z. B. eine Fahrgemeinschaftswebsite, die jetzt nach Taxis sucht und online Zahlungen tätigt, können Sie eine abstrakte Fabrik in Ihrem Kern verwenden. Auf diese Weise können Sie einfach eine weitere Fabrik mit Kabinen und Fahrgemeinschaften einrasten lassen.
Beide Fabriken haben nichts miteinander zu tun, daher ist es ein gutes Design, sie in verschiedenen Fabriken zu halten.
Hoffe das ist jetzt klar. Studieren Sie die Website noch einmal unter Berücksichtigung dieses Beispiels, hoffentlich hilft es. Und ich hoffe wirklich, dass ich die Muster richtig dargestellt habe :).
quelle
Für diese Antwort verweise ich auf das Buch "Gang of Four".
Es gibt keine „Factory“ noch „Simple Factory“ noch „Virtual Factory“ Definitionen in dem Buch. Wenn Leute über das "Factory" -Muster sprechen, sprechen sie normalerweise über etwas, das ein bestimmtes Objekt einer Klasse erzeugt (aber nicht über das "Builder" -Muster). Sie können sich auf die Muster "Factory Method" oder "Abstract Factory" beziehen oder nicht . Jeder kann "Factory" implementieren, da dies kein formeller Begriff ist (denken Sie daran, dass einige Personen \ Unternehmen \ Communities ihren eigenen Wortschatz haben können).
Das Buch enthält nur Definitionen für "Abstract Factory" und "Factory Method".
Hier sind Definitionen aus dem Buch und eine kurze Erklärung, warum beide so verwirrend sein können. Ich lasse Codebeispiele weg, weil Sie sie in anderen Antworten finden können:
Factory-Methode (GOF) : 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 (GOF) : Bieten Sie eine Schnittstelle zum Erstellen von Familien verwandter oder abhängiger Objekte, ohne deren konkrete Klassen anzugeben.
Quelle der Verwirrung : Oft kann man eine Klasse, die im Muster "Factory Method" verwendet wird, als "Factory" bezeichnen. Diese Klasse ist per Definition abstrakt. Deshalb ist es einfach, diese Klasse "Abstract Factory" zu nennen. Aber es ist nur der Name der Klasse; Sie sollten es nicht mit dem Muster "Abstract Factory" (Klassenname! = Mustername) verwechseln. Das Muster "Abstract Factory" ist anders - es wird keine abstrakte Klasse verwendet. Es definiert eine Schnittstelle (nicht unbedingt eine Programmiersprachenschnittstelle) zum Erstellen von Teilen eines größeren Objekts oder von Objekten, die miteinander in Beziehung stehen oder auf eine bestimmte Weise erstellt werden müssen.
quelle
Mit der Factory-Methode kann der Benutzer A1 oder A2 von AbstractProductA erstellen.
Abstract Factory verfügt jedoch über mehr als eine Factory-Methode (z. B. 2 Factory-Methoden). Mit diesen Factory-Methoden wird die Menge der Objekte / verwandten Objekte erstellt. Mit Abstract Factory kann der Benutzer A1, B1-Objekte von AbstractProductA, AbstractProductB erstellen
quelle
Niemand hat das ursprüngliche Buch Design Patterns: Elements of Reusable Object-Oriented Software zitiert , das die Antwort in den ersten beiden Absätzen des Abschnitts „Discussion of Creational Patterns“ (Schwerpunkt Mine) gibt:
quelle