Ähnlichkeiten und Unterschiede zwischen den beiden:
Vorlagenmethode
- Verlässt sich auf Vererbung.
- Definiert die Schritte eines Algorithmus und überlässt die Implementierung dieser Schritte Unterklassen.
Fabrikmethode
- Verlässt sich auf Vererbung.
- Eine Oberklasse definiert eine Schnittstelle zum Erstellen eines Objekts. Unterklassen entscheiden, welche konkrete Klasse instanziiert werden soll.
Die beiden nebeneinander:
Ich bin mir nicht sicher, was der Ausdruck "Factory-Methode ist eine Spezialisierung der Vorlagenmethode" bedeutet (er steht im Buch " Head First Design Patterns" ). In haben Beverage
wir die Methode, prepare
die final
eine Reihe von Schritten ist und definiert. In haben PizzaStore
wir eine Methode, die ist abstract
, und Unterklassen definieren sie neu. Wie ist das letztere eine Spezialisierung des ersteren?
design-patterns
object-oriented-design
factory-method
template-method
Maria Ines Parnisari
quelle
quelle
Antworten:
In haben
Beverage
wir die Methode ("template"),prepare
die einige abstrakte Methoden wie usw. aufruftboilWater
,brew
die in den Unterklassen implementiert sind. Es ist nicht unbedingt erforderlich, dass sich das Muster in der Basisklasse befindet, es könnte sich an einer anderen Stelle befinden, vorausgesetzt, die abstrakten Methoden sind öffentlich. Es ist jedoch im Wesentlichen so, dass es abstrakte Methoden gibt, die überschrieben werden müssen und die Lücken in der "Algorithmusvorlage" füllen.Bei der Factory-Methode handelt es sich auch um eine Klasse, in der abstrakte Methoden überschrieben werden. Ein zentraler Punkt ist, dass der Aufrufer dieser Methode den genauen Typ des erstellten Objekts nicht kennen muss. Beachten Sie, dass
PizzaStore
die abstrakte MethodecreatePizza
irgendwo von - sagen wir eine Methode - aufgerufen werden musscreateLotsOfPizza
.Dies macht letztere zu einer Vorlagenmethode, bei der die spezifischen Schritte des "Algorithmus zum Erstellen von Pizzen" die zu füllenden Lücken sind. Jetzt ist es wahrscheinlich nur eine ungenaue Verwendung von Wörtern, indem gesagt wird, dass "das Factory-Methodenmuster" ein Sonderfall des Musters "Vorlagenmethode" ist. Insbesondere die "Factory-Methoden" sind keine "Template-Methoden", sie können jedoch von einer Template-Methode aufgerufen werden. Genauer gesagt könnten wir sagen
und ich denke, das wollten die Autoren dieses Buches ausdrücken.
quelle
Ich denke, "Factory-Methode ist eine Spezialisierung der Template-Methode" ist eine falsche Charakterisierung. Ich glaube, es wäre genauer zu sagen, dass das Muster der Vorlagenmethode lediglich eine Variation des Musters der Factory-Methode ist.
Außerdem behaupte ich, dass das Muster der Vorlagenmethode überhaupt kein Muster ist (im Sinne der Viererbande), da es auf natürliche Weise durch Vererbung und Überschreiben von Methoden entsteht. Sie können sehen, dass im obigen Diagramm für das Vorlagenmuster die untergeordneten Klassen lediglich Methoden in der Basisklasse mit ihrem eigenen Verhalten überschreiben.
Insgesamt sind Software-Muster (der Sorte Gang of Four) eigentlich nur Problemumgehungen für Mängel in Programmiersprachen, und das Vorlagenmuster gibt nur an, wozu objektorientierte Sprachen bereits nativ fähig sind.
quelle
Ich würde sagen, Head First ist in dieser Charakterisierung einfach falsch.
Wikipedia definiert die Vorlagenmethode als:
(Es verweist dafür auf GoF.)
Die Factory-Methode ist definiert als:
Es gibt keine Überlappung zwischen den beiden, außer dass in C ++ die Vererbung ein wesentlicher Bestandteil von beiden ist. In Sprachen, die zwischen Implementierungsvererbung (
extends
in Java) und Schnittstellenimplementierung (implements
in Java) unterscheiden, gibt es jedoch auch diese Gemeinsamkeit nicht, da die Schnittstellenimplementierung für die Factory-Methode ausreicht, nicht jedoch für die Template-Methode. In C ++ kann die reine Implementierungsvererbung (ohne die Schnittstellenvererbung, dh private Vererbung oder CRTP) für die erstere verwendet werden, nicht jedoch für die letztere.Und davon abgesehen? Eines ist ein Verhaltensmuster, das andere ein Kreationsmuster. Einer beschreibt einen Überblick über eine Operation, wobei einige Schlüsselteile von speziellen Unterklassen ausgefüllt werden müssen. Der andere legt einen sehr einfachen Vertrag fest, der die gesamte Implementierung den konkreten Instanzen überlässt. Sie sind völlig verschieden.
Meiner Meinung nach ist die zitierte Zeile einfach falsch. Entweder handelt es sich um einen offensichtlichen Fehler im Buch, oder (weniger wahrscheinlich) es ist aus dem Zusammenhang geraten und sollte anders interpretiert werden.
quelle