Similitudes y diferencias entre los dos:
Método de plantilla
- Se basa en la herencia.
- Define los pasos de un algoritmo y deja la tarea de implementarlos en subclases.
Método de la fábrica
- Se basa en la herencia.
- Una superclase define una interfaz para crear un objeto. Las subclases deciden qué clase concreta instanciar.
Los dos lado a lado:
No estoy seguro de lo que significa la frase "El método de fábrica es una especialización del método de plantilla" (está en el libro Head First Design Patterns ). En Beverage
tenemos el método prepare
que es final
y define una serie de pasos. En PizzaStore
tenemos un método que es abstract
, y las subclases lo redefinen. ¿Cómo es esto último una especialización de lo primero?
design-patterns
object-oriented-design
factory-method
template-method
Maria Inés Parnisari
fuente
fuente
Respuestas:
En
Beverage
tenemos el método ("plantilla")prepare
que llama a algunos métodos abstractos comoboilWater
,brew
etc. , que se implementan en las subclases. No es esencialmente que el patrón tenga el método de plantilla ubicado en la clase base, podría estar en cualquier otro lugar, asumiendo que los métodos abstractos son públicos. Pero es esencialmente que existen los métodos abstractos que deben ser anulados y llenarán los vacíos en la "plantilla de algoritmo".El método de fábrica también se trata de una clase en la que se sobrescriben los métodos abstractos, un punto central es la persona que llama de ese método que no necesita saber el tipo exacto del objeto creado. Tenga en cuenta que en
PizzaStore
, el método abstractocreatePizza
debe llamarse en algún lugar desde - digamos un métodocreateLotsOfPizza
.Esto hace de este último un método de plantilla, donde los pasos específicos del "algoritmo para crear pizzas" son los vacíos que se deben llenar. Ahora es probablemente un uso impreciso de las palabras al decir que "el patrón del método de fábrica" es un caso especial del patrón del "método de plantilla". Especialmente los "métodos de fábrica" no son "métodos de plantilla", sin embargo, pueden llamarse desde un método de plantilla. Entonces, para ser más precisos, podríamos decir
y supongo que eso es lo que los autores de ese libro querían expresar.
fuente
Creo que "Método de fábrica es una especialización del Método de plantilla" es una caracterización errónea. Creo que sería más exacto decir que el patrón del Método de plantilla es simplemente una variación del patrón del Método de fábrica.
Además, afirmo que el patrón del Método de plantilla no es realmente un patrón (en el sentido de la Banda de los Cuatro), ya que surge naturalmente a través de la anulación de la herencia y el método. Puede ver que, en el diagrama anterior para el Patrón de plantilla, las clases descendientes simplemente anulan los métodos en la clase base con su propio comportamiento.
En general, los patrones de software (de la variedad Gang of Four) son en realidad soluciones alternativas para las deficiencias en los lenguajes de programación, y el patrón de plantilla solo reafirma de qué lenguajes orientados a objetos ya son nativamente capaces.
fuente
Diría que Head First simplemente está equivocado en esta caracterización.
Wikipedia define el Método de plantilla como:
(Hace referencia a GoF para eso).
Y el Método de Fábrica se define como:
No hay superposición entre los dos, excepto que en C ++, la herencia es una parte clave de ambos. Sin embargo, en los lenguajes que distinguen entre herencia de implementación (
extends
en Java) e implementación de interfaz (implements
en Java), incluso esta característica común no existe, ya que la implementación de la interfaz es suficiente para el método de fábrica, pero no para el método de plantilla. Y en C ++, la herencia de implementación pura (sin la herencia de interfaz, es decir, herencia privada o CRTP) se puede usar para la primera, pero no para la segunda.¿Y aparte de eso? Uno es un patrón de diseño de comportamiento, el otro un patrón de creación. Uno describe un esquema de una operación, con algunas partes clave que deben ser completadas por subclases especializadas; el otro especifica un contrato muy simple, dejando toda la implementación a las instancias concretas. Son completamente distintos.
En mi opinión, la línea que se cita es simplemente incorrecta. O es un error evidente en el libro, o (menos probable) está fuera de contexto y debe interpretarse de manera diferente.
fuente