"Factory Method ist eine Spezialisierung der Template Method". Wie?

10

Ä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:

Geben Sie hier die Bildbeschreibung ein

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 Beveragewir die Methode, preparedie finaleine Reihe von Schritten ist und definiert. In haben PizzaStorewir eine Methode, die ist abstract, und Unterklassen definieren sie neu. Wie ist das letztere eine Spezialisierung des ersteren?

Maria Ines Parnisari
quelle
5
Ich sehe viele Abstimmungen der Musterpolizei zu diesem Beitrag. Es gibt wirklich keinen Grund dafür; Sie haben jetzt drei Leute, die sagen, dass der Satz wahrscheinlich schlecht beraten ist. Hinweis für die Leser dieses Beitrags: Glauben Sie nicht alles, was Sie in einem Buch oder online lesen.
Robert Harvey

Antworten:

6

In haben Beveragewir die Methode ("template"), preparedie einige abstrakte Methoden wie usw. aufruft boilWater, brewdie 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 PizzaStoredie abstrakte Methode createPizzairgendwo von - sagen wir eine Methode - aufgerufen werden muss createLotsOfPizza.

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

"Das Factory-Methodenmuster wird normalerweise in Verbindung mit einem Sonderfall des Template-Methodenmusters verwendet."

und ich denke, das wollten die Autoren dieses Buches ausdrücken.

Doc Brown
quelle
2

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.

Robert Harvey
quelle
Wenn Sie eine Definition eines Entwurfsmusters verwenden, bei der die Vorlagenmethode kein Entwurfsmuster ist, ist Ihre Definition meiner Meinung nach falsch. Entwurfsmuster sind abstrakte Ideen, die Beziehungen zwischen verschiedenen Teilen Ihres Codes vermitteln und nichts mit der Sprache zu tun haben, in der sie implementiert sind. Entwurfsmuster sind keine Implementierungsdetails, sondern Beschreibungen, die auf hoher Ebene in verwendet werden können um die Entwurfsentscheidungen zu kommunizieren, die in Bezug auf einen Teil eines Systems getroffen wurden.
Jules
Insbesondere ist die Vorlagenmethode eine bestimmte Methode zur Verwendung der Vererbung , die unter bestimmten Umständen nützlich ist. Es handelt sich jedoch eindeutig um eine Entwurfsentscheidung, da es andere Möglichkeiten gibt, denselben Zweck zu erreichen (der gleiche Effekt könnte beispielsweise durch Aggregation erzielt werden). In diesem Fall würde es wahrscheinlich als Beispiel für das Strategiemuster angesehen. Angesichts der Tatsache, dass eine Entscheidung getroffen wird, ist ein Name wichtig, damit wir über diese Entscheidung sprechen können. Wenn wir einen solchen Namen haben, handelt es sich um ein Entwurfsmuster.
Jules
1

Ich würde sagen, Head First ist in dieser Charakterisierung einfach falsch.

Wikipedia definiert die Vorlagenmethode als:

In der Softwareentwicklung ist das Muster der Vorlagenmethode ein Verhaltensentwurfsmuster, das das Programmgerüst eines Algorithmus in einer Operation definiert und einige Schritte auf Unterklassen verschiebt.

(Es verweist dafür auf GoF.)

Die Factory-Methode ist definiert als:

Bei der klassenbasierten Programmierung ist das Factory-Methodenmuster ein Erstellungsmuster, das Factory-Methoden verwendet, um das Problem des Erstellens von Objekten zu lösen, ohne die genaue Klasse des zu erstellenden Objekts angeben zu müssen.

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 ( extendsin Java) und Schnittstellenimplementierung ( implementsin 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.

Sebastian Redl
quelle
Ich denke, die Aussage ist nicht einfach "falsch", es ist nur eine schlampige Verwendung von Wörtern. Siehe meine Bearbeitung.
Doc Brown