2012-02-18 20 views
5

En la mayoría de los tutoriales (libro de Judith Bishops, o here), veo un ejemplo similar al siguiente.¿Por qué usar el patrón de generador?

Si el Builder significa crear método de construcción en la clase directora, que lleva a cabo un conjunto de operaciones Constructor Childs ...

class Director { 
    public static void Construct(Builder builder) { 
    builder.BuildPartA(); 
    builder.BuildPartB(); 
    ... 
    } 
} 

abstract class Builder { 
    public abstract void BuildPartA(); 
    public abstract void BuildPartB(); 
    ... 
} 

class Builder1 : Builder { ... } 
class Builder2 : Builder { ... } 

void Main() { 
    Builder1 b1 = new Builder1(); 
    Builder2 b2 = new Builder2(); 
    Director.Construct(b1); 
    Director.Construct(b2); 
} 

... ¿Por qué no basta con mover el método de construcción para el Constructor ¿clase?

class Builder { 
    public virtual void BuildPartA(); 
    public virtual void BuildPartB(); 
    public void Construct() { 
    BuildPartA(); 
    BuildPartB(); 
    ... 
    } 
    ... 
} 

class Builder1 : Builder { ... } 
class Builder2 : Builder { ... } 

void Main() { 
    Builder1 b1 = new Builder1(); 
    Builder2 b2 = new Builder2(); 
    b1.Construct(); 
    b2.Construct(); 
} 

Por favor, muéstreme un ejemplo donde el patrón de constructor es realmente útil.

+0

No estoy seguro de si he utilizado este patrón hasta ahora, pero parece que la idea es permitir que el constructor para ser implementado independiente de su definición, lo que permite la existencia de cualquier número de constructores diferentes totalmente independientes de la clase de director que los está utilizando. – rid

+0

@Radu: pero la clase Director no es independiente del Constructor: usa la clase Constructor en el parámetro Construir. –

+0

Es cierto que usa un generador, pero no tiene que saber cómo se implementa el generador. Solo conoce la interfaz pública. Del mismo modo, el constructor no necesita conocer los detalles de las clases que lo utilizan. – rid

Respuesta

5

Se supone que el Directorio conoce la secuencia correcta de ensamblaje de diferentes componentes para construir los objetos. Creo que es simplemente separar la preocupación de conocer el orden o el método de construcción de estos objetos a partir de la clase base del Constructor (que es simplemente una clase base). Si movió la construcción a la base de Constructor, se parecería al patrón de método de la plantilla.

Es mejor tener un director por separado que sepa cómo ensamblar los componentes porque en el momento en que la "receta" de construcción de los componentes cambia, no es necesario cambiar la clase base. Por ejemplo, supongamos que una cierta clase de componentes necesita ser construida mediante la ejecución de 3 pasos en un orden determinado:

  1. Paso A
  2. Paso B
  3. Paso C

Digamos que en algún punto se agrega otro componente a la familia que se puede construir con los mismos pasos pero en un orden diferente:

  1. Paso A
  2. Paso C
  3. Paso B

En este caso, si la lógica para la secuencia se separa en el director en comparación con el constructor de la clase base, se puede heredar un nuevo director y el uso que para construir . Si la lógica estaba en el Constructor base, la clase base, que puede ser parte de una biblioteca separada o JAR o un archivo de encabezado en el caso de C++, puede haber requerido la recompilación de las clases concretas o al menos enviar un nuevo JAR.

Estoy seguro de que hay más ventajas de separar esa preocupación.

+0

¿Pero por qué separar la lógica del generador? El Director no tiene acceso a miembros privados de Builder y hace que el código sea más difícil de entender ... Lo siento si no lo obtengo: ¿podría darnos algún ejemplo aclaratorio? –

+0

@ JanTuroň Ver mi actualización a la respuesta – Sid

+0

+1 ya que la necesidad de una recompilación adicional podría ser una razón a veces. Pero aún así, la complejidad adicional para el patrón del constructor es un precio demasiado alto para mí. –

1
+0

Entonces, si esos constructores son objetos reutilizables y queremos que realicen un conjunto específico de operaciones solo en un lugar, se confundiría el código con un método que se usa solo una vez, por lo que es mejor mantener estas operaciones en clases personalizadas y que es el propósito del Director. Esta sería una buena razón para el patrón del Constructor. ¿Entendí el punto? –

+0

Bueno, imaginemos en el contexto del ejemplo del video ... digamos que estamos construyendo un mapa, pero como el jugador no tiene más herramientas para minar, el juego no genera "recursos" en el mapa ya que el usuario no puede accede a ellos ¿Por qué poner la lógica sobre si agregar recursos al mapa en cada generador, cuando esa lógica puede residir en el director, quien le dice al generador actual si debe generar o no recursos? – arieljake

+1

@arieljake: el enlace no funciona. Entiendo que es muy viejo pero solo para tu información. – user2463514

Cuestiones relacionadas