Von GOF Buch:
Klassenmuster behandeln Beziehungen zwischen Klassen und ihren Unterklassen. Diese Beziehungen werden durch Vererbung hergestellt, Daher sind sie zur Kompilierungszeit statisch festgelegt. Objektmuster handeln mit Objektbeziehungen, die zur Laufzeit und geändert werden können sind dynamischer. Fast alle Muster verwenden zu einem gewissen Grad Vererbung. Die einzigen Muster, die als "Klassenmuster" bezeichnet werden, sind solche, auf die man sich konzentriert Klassenbeziehungen.
Warum ist Factory-Methode ein Klassenmuster, und abstract factory ein Objektmuster, vorausgesetzt, sie scheinen sehr ähnliche Muster zu sein?
Danke.
Das GOF-Buch sagt
Absicht
Definieren Sie eine Schnittstelle zum Erstellen eines Objekts, aber lassen Sie Unterklassen entscheiden, welche Klasse instanziiert werden soll.
Was bedeutet das? Schauen wir uns das Beispiel an, das das Buch zeigt.
Im Beispiel definiert ein Framework die Schnittstelle Application
, damit andere es implementieren können. Dies bedeutet, dass ich z.B. a MyApplication
oder MyOtherApplication
gefällt das:
Wenn das Framework startet, kann es je nach dem, was es auf dem Klassenpfad findet, eine dieser Implementierungen auswählen.
Aber es bedeutet, dass, nachdem das Framework entweder MyApplication
oder MyOtherApplication
instanziiert hat, die Art, wie ein Dokument erstellt wird, behoben ist. Die Art und Weise, wie ein Dokument erstellt wird, kann zur Laufzeit nicht mehr geändert werden für die Instanz Application
. Es gibt keinen Setter oder irgendetwas anderes , mit dem Sie die Art der Erstellung von Document
ändern können. Daher wird es auch als virtueller Konstruktor bezeichnet und ist daher ein Klassenmuster .
Im Gegensatz zur Factory-Methode kann eine abstrakte Factory zur Laufzeit und damit die Art der erzeugten Objekte geändert werden. Deshalb sagen sie, dass es ein Objektmuster ist.
Eine abstrakte Fabrik ist auch verantwortlich für die Erstellung
... Familien verwandter oder abhängiger Objekte ...
Dies ist auch ein Unterschied zur Factory-Methode aka. virtueller Konstruktor .
Factory Method und Abstract Factory sind ähnlich in der Absicht, aber in der Umsetzung sehr unterschiedlich (man könnte sogar das Gegenteil behaupten). Mit anderen Worten, diese Muster repräsentieren verschiedene Wege zur Lösung des gleichen Problems (Instanziierung).
Die GoF sagt,
Wir klassifizieren Designmuster nach zwei Kriterien. Das erste Kriterium, purpose zeigt an, was ein Muster bewirkt.
Da ihre Absicht ähnlich ist (d. h. sie haben den gleichen Zweck), werden diese beiden Muster beide als creational klassifiziert.
Der GoF fährt fort zu sagen,
Das zweite Kriterium, scope , gibt an, ob das Muster angewendet wird hauptsächlich zu Klassen oder zu Objekten.
Dies führt zu dem Zitat aus dem OP, wo Klassen- und Objektumfang jeweils definiert sind. Da sich die Implementierung von Factory Method auf die Vererbung (eine Klassenbeziehung) konzentriert, während sich die Implementierung von Abstract Factory auf Komposition (eine Objektbeziehung) konzentriert, werden diese beiden Muster in entgegengesetzte Bereiche eingeteilt.
Die Definitionen und Implementierungen dieser beiden Muster finden sich in zahlreichen anderen SO-Threads, daher werde ich sie hier nicht wiederholen. Ich habe auch die Frage nach der Zusammensetzung und der Vererbung in diesen beiden Mustern berührt. anderswo .
Fabrikmuster sind wahrscheinlich besser in einer eigenen Kategorie zu platzieren. Aber die Logik hinter der Objekt- / Klasseneinteilung ist vielleicht ganz einfach. Factory-Methode in seiner minimalen Form ist statisch (nicht konfigurierbar), genau wie Klassen sind. Aber abstrakte Factory-Ergebnis (Objekt, das sie produzieren) Klasse hängt von einigen Eingabedaten ab, und da es sich um einen dynamischen Effekt handelt, sollte es in die Objektmusterkategorie eingefügt werden.
Tags und Links design-patterns oop factory-method abstract-factory