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

7

Similitudes y diferencias entre los dos:

Método de plantilla

  • Depende de la herencia.
  • Define los pasos de un algoritmo y deja la tarea de implementarlos en subclases.

Método de fábrica

  • Depende de la herencia.
  • Una superclase define una interfaz para crear un objeto. Las subclases deciden qué clase concreta se debe instanciar.

Los dos lado a lado:

Noestoysegurodeloquesignificalafrase"Método de fábrica es una especialización del Método de plantilla" (está en Libro de 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 esta última una especialización de la primera?

    
pregunta Maria Ines Parnisari 12.01.2017 - 23:38

3 respuestas

5

En Beverage tenemos el método ("plantilla") prepare que llama a algunos métodos abstractos como boilWater , brew etc. que se implementan en las subclases. No es esencialmente para 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 hay métodos abstractos que deben anularse y llenarán los huecos 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 el llamador de que el método no necesita saber el tipo exacto del objeto creado. Tenga en cuenta que en PizzaStore , el método abstracto createPizza debe llamarse en algún lugar desde - digamos un método createLotsOfPizza .

Esto convierte a este último en un método de plantilla, donde los pasos específicos del "algoritmo para crear pizzas" son los huecos que se deben llenar. Ahora probablemente es solo un uso impreciso de las palabras diciendo 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 ser llamados desde un método de plantilla. Así que para ser más precisos, podríamos decir

  

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

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

    
respondido por el Doc Brown 12.01.2017 - 23:50
0

Creo que "El 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 no es más que una variación en el 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 absoluto (en el sentido de Gang of Four), ya que surge naturalmente a través de la herencia y la anulación del método. Puede ver que, en el diagrama anterior para el Patrón de plantilla, las clases descendientes simplemente anulan los métodos de la clase base con su propio comportamiento.

En general, los patrones de software (de la variedad Gang of Four) son realmente soluciones para las deficiencias en los lenguajes de programación, y el patrón de plantillas solo replantea los lenguajes orientados a objetos que ya son nativos.

    
respondido por el Robert Harvey 12.01.2017 - 23:50
0

Yo diría que Head First está simplemente 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, aplazando 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 usa métodos de fábrica para resolver 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 hacen una distinción entre la herencia de implementación ( extends en Java) y la implementación de la interfaz ( implements en Java), incluso este punto común no existe, ya que la implementación de la interfaz es suficiente para el método de fábrica, pero no el método de plantilla . Y en C ++, la herencia de implementación pura (sin la herencia de interfaz, es decir, la 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 es un patrón de creación. Uno describe el esquema de una operación, con algunas partes clave que deben ser completadas por subclases especializadas; el otro especifica un contrato muy simple, dejando la implementación completa a las instancias concretas. Son completamente distintos.

En mi opinión, la línea citada es simplemente incorrecta. O bien es un error evidente en el libro, o (menos probable) está fuera de contexto y debe interpretarse de manera diferente.

    
respondido por el Sebastian Redl 13.01.2017 - 11:00