Recientemente me encontré con el patrón de diseño de Builder. Parece que diferentes autores usan el "patrón de construcción" para referirse a diferentes sabores, así que permítanme describir el patrón sobre el que estoy preguntando.Patrón de diseño del generador: ¿por qué necesitamos un Director?
Tenemos un algoritmo para crear productos, es decir, objetos de diferentes tipos. A un nivel suficientemente alto de abstracción, el algoritmo es el mismo para todos los tipos de productos, pero cada tipo de producto requiere una implementación diferente de cada uno de los pasos abstractos del algoritmo. Por ejemplo, podríamos tener el siguiente algoritmo pastelera:
1. Add liquids.
2. Mix well.
3. Add dry ingredients.
4. Mix well.
5. Pour batter into baking pan.
6. Bake.
7. Return baked cake.
Diferentes tortas requerirían diferentes implementaciones de estos pasos, es decir, lo que los líquidos/ingredientes secos a utilizar, qué velocidad para mezclar en, ¿cuánto tiempo para hornear , etc.
El patrón dice que lo haga así. Para cada producto creamos una clase de generador de hormigón con una implementación para cada uno de los pasos anteriores. Todas estas clases se derivan de una clase base del generador abstracto, que es esencialmente una interfaz. Así, por ejemplo, vamos a tener una clase base abstracta CakeBaker
con métodos virtuales puros AddLiquid()
, MixLiquids()
, etc. Los panaderos de la torta de hormigón será subclases concretas, por ejemplo,
class ChocolateCakeBaker : public CakeBaker {
public:
virtual void AddLiquids()
{
// Add three eggs and 1 cup of cream
}
virtual void AddDryIngredients()
{
// Add 2 cups flour, 1 cup sugar, 3 tbsp cocoa powder,
// 2 bars ground chocolate, 2 tsp baking powder
}
...
...
};
El LemonCitrusCakeBaker
también sería una subclase de CakeBaker
, pero usaría diferentes ingredientes y cantidades en sus métodos.
Los diferentes tipos de tortas serán, de manera similar, subclases de una clase base abstracta Cake
.
Finalmente, tenemos una clase para implementar el algoritmo abstracto. Este es el director . En el ejemplo de panadería podríamos llamarlo ExecutiveBaker
. Esta clase aceptaría (del cliente) un objeto concreto de construcción y usaría sus métodos para crear y devolver el producto deseado.
Aquí está mi pregunta. ¿Por qué necesitamos que el director esté separado del constructor abstracto? ¿Por qué no incluirlos en una única clase base abstracta del constructor, protegiendo los métodos públicos del creador abstracto original (y las subclases concretas los reemplazan como antes).
¿Eso significa que en una aplicación MVC, un controlador (en realidad un método del controlador, en mi caso específico) podría ser el "director"? –