Encontré la misma pregunta muy interesante.
El ejemplo del coche Saab es interesante, pero no se ajusta a la descripción del patrón del Constructor en "Banda de cuatro" (Patrones de diseño).
Utilizaré la terminología de "Gang of Four".
En Gang of Four, no puede haber una mezcla de constructores de hormigón por cada invocación de aDirector->Construct()
por lo que el ejemplo de Saab, si bien es interesante, no responde la pregunta realmente para mí.
veo algunas:
La separación del objeto del administrador de la jerarquía Builder es una diferencia clave. En la fábrica de plantillas, tanto el método que incorpora el flujo generalizado como los métodos modificados son miembros de la misma clase. Esto hace que el patrón del generador sea mejor para encapsular las etapas internas del proceso, ya que es menos probable que el código del cliente entre en contacto con dichos métodos si se accede solo al objeto director. El patrón de generador también permite una formulación del proceso de ensamblaje completamente independiente de la jerarquía del generador, lo que permite un reemplazo más flexible de la instancia del generador cuando sea necesario. Por ejemplo, una vez que tenga una instancia de director a la mano, puede construir fácilmente varias representaciones del producto, cada vez reemplazando dinámicamente el generador de concreto. Entonces el constructor es más dinámico y encapsula mejor el funcionamiento interno del constructor de concreto.
Además, si desea detallar el objeto Director por herencia, puede hacerlo sin multiplicar su jerarquía. Por ejemplo, puede tener un proceso expreso de construcción para ahorrar tiempo antes de la construcción final: puede subclasificar el objeto Director o incluso usar el "Método de plantilla" en él para personalizarlo por herencia sin tener que volver a implementar sus constructores de hormigón.
Pero esto nos lleva a considerar otro patrón que está estrechamente relacionado con "Template Factory" - el patrón de "Estrategia".
La estrategia se parece mucho a Template Factory, con dos claras diferencias: también separa un objeto de contexto de la jerarquía de estrategias, permitiendo el cambio de algoritmos para una sola instancia de problema en tiempo de ejecución. Otra diferencia es que los ejemplos parecen sugerir que la invocación de la Estrategia no implica necesariamente un proceso complejo o estructurado como en "Método de plantilla".
Pero lo traigo aquí como análogo de Builder para llegar a otro punto - Si "Estrategia" es paralelo en su estructura de clases a Builder, entonces el patrón creacional paralelo a "Método de plantilla" debería ser "Método de fábrica" . Esto es claro, no solo por su nombre, pero, curiosamente, las discusiones de ambos capítulos del libro "Método de fábrica" y "Método de plantilla" usan ejemplos casi idénticos (una aplicación para editar documentos).
Entonces, sin entrar en la cuestión de cuál es la diferencia entre los patrones creacionales y de comportamiento, tiendo a pensar que tanto el Builder como el Factory Method son básicamente casos específicos y refinamientos de Strategy y Template Method, respectivamente.
Entonces la pregunta es - si usted no ve ninguna diferencia entre Builder y la plantilla de la fábrica - tratar de responder a estas preguntas:
¿Qué perspectiva prefiere tener en esa parte particular del sistema? ¿Es "comportamiento" o "creación"? y
¿Necesita una fuerte encapsulación, o el reemplazo dinámico o despliegue o ajuste de una instancia de generador, por un lado, o espera que la complejidad (por herencia, composición u otra) evolucione alrededor del proceso de creación o método de la plantilla? Si la respuesta a cualquiera de estas preguntas va con la estructura del Constructor/Estrategia. De lo contrario, use un polimorfismo simple de relación o comportamiento en los patrones del Método XX.
Gracias jgauffin. Una pregunta relacionada con el funcionamiento del director en el constructor. ¿El director no tiene pasos para crear el objeto en un orden específico? ¿Qué pasa si un constructor quiere cambiar el orden? Me refiero al ejemplo proporcionado aquí http://www.dofactory.com/Patterns/PatternBuilder.aspx#_self1 –
Bueno. Entonces está rompiendo el Principio de Substitución de Liskovs y debería rediseñar su código;) – jgauffin