Warum ist Factory-Methode ein Klassenmuster, während eine abstrakte Fabrik ein Objektmuster?

8

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.

    
Tim 04.09.2017, 16:48
quelle

3 Antworten

1

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:

%Vor%

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 .

Abstrakte Fabrik

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 .

    
René Link 05.09.2017, 18:42
quelle
1

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 .

    
jaco0646 10.09.2017 14:54
quelle
0

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.

    
Mikhail Karakulov 05.09.2017 06:09
quelle