"El método de fábrica es una especialización del método de plantilla". ¿Cómo?

10

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:

ingrese la descripción de la imagen aquí

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 Beveragetenemos el método prepareque es finaly define una serie de pasos. En PizzaStoretenemos un método que es abstract, y las subclases lo redefinen. ¿Cómo es esto último una especialización de lo primero?

Maria Inés Parnisari
fuente
55
Veo muchos votos negativos en esta publicación de la policía modelo. Realmente no hay razón para eso; ahora tiene tres personas que dicen que la frase probablemente sea desaconsejada. Nota para los lectores de esta publicación: no creas todo lo que lees en un libro o en línea.
Robert Harvey

Respuestas:

6

En Beveragetenemos el método ("plantilla") prepareque llama a algunos métodos abstractos como boilWater, brewetc. , 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 abstracto createPizzadebe llamarse en algún lugar desde - digamos un método createLotsOfPizza.

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

"el patrón de método de fábrica se usa típicamente junto con un caso especial del patrón de método de plantilla"

y supongo que eso es lo que los autores de ese libro querían expresar.

Doc Brown
fuente
2

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.

Robert Harvey
fuente
Si está utilizando una definición de un patrón de diseño que hace que el Método de plantilla no sea un patrón de diseño, creo que su definición es incorrecta. Los patrones de diseño son ideas abstractas que transmiten relaciones entre diferentes partes de su código y no tienen nada que ver con el lenguaje en el que se implementan. Los patrones de diseño no son detalles de implementación, son descripciones que se pueden usar a un alto nivel en para comunicar las decisiones de diseño que se han tomado con respecto a parte de un sistema.
Jules
Más específicamente, el Método de plantilla es una forma particular de usar la herencia que es útil en algunas circunstancias, pero es claramente una decisión de diseño ya que hay otras formas de lograr el mismo propósito (el mismo efecto podría lograrse, por ejemplo, usando la agregación, en cuyo caso probablemente se consideraría una instancia del patrón de Estrategia). Dado que se está tomando una decisión, un nombre es importante para permitirnos hablar sobre esa decisión, y donde tenemos un nombre como ese es un patrón de diseño.
Jules
1

Diría que Head First simplemente está equivocado en esta caracterización.

Wikipedia define el Método de plantilla como:

En ingeniería de software, el patrón de método de plantilla es un patrón de diseño de comportamiento que define el esqueleto del programa de un algoritmo en una operación, difiriendo algunos pasos a las subclases.

(Hace referencia a GoF para eso).

Y el Método de Fábrica se define como:

En la programación basada en clases, el patrón de método de fábrica es un patrón de creación que utiliza métodos de fábrica para tratar el problema de crear objetos sin tener que especificar la clase exacta del objeto que se creará.

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 ( extendsen Java) e implementación de interfaz ( implementsen 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.

Sebastian Redl
fuente
Creo que la afirmación no es simplemente "incorrecta", es solo un uso descuidado de las palabras. Mira mi edición.
Doc Brown