468 votos

Cuándo se debe utilizar el Generador de Patrón?

¿Cuáles son algunos common, real world examples de utilizar el Generador de Patrón? ¿Qué comprar? ¿Por qué no usar simplemente un Patrón de Fábrica?

935voto

Kamikaze Mercenary Puntos 9341

A continuación son algunas de las razones para argumentar el uso de la pauta y ejemplo de código en Java, pero es una implementación del Generador de Patrón cubierto por la banda de los Cuatro en los Patrones de Diseño. Las razones por las que iba a usar en Java también son aplicables a otros lenguajes de programación así.

Como Joshua Bloch estados en Efectivo Java, 2nd Edition:

El generador de patrón es una buena opción a la hora de diseñar clases cuyos constructores o estática fábricas se han más que un puñado de parámetros.

Todos hemos en algún momento encontró una clase con una lista de constructores, donde cada adición se añade un nuevo parámetro de opción:

Pizza(int size) { ... }        
Pizza(int size, boolean cheese) { ... }    
Pizza(int size, boolean cheese, boolean pepperoni) { ... }    
Pizza(int size, boolean cheese, boolean pepperoni, boolean bacon) { ... }

Este es el llamado Telescópica Constructor Patrón. El problema con este modelo es que una vez que los constructores son 4 o 5 los parámetros de tiempo se convierte en difícil recordar la necesaria orden de los parámetros , así como lo particular del constructor que pueda desear en una situación dada.

Una alternativa que tienen para el Telescópica Constructor Patrón es el JavaBean Patrón donde se llama a un constructor con parámetros obligatorios y, a continuación, llamar a cualquier facultativo de incubadoras después de:

Pizza pizza = new Pizza(12);
pizza.setCheese(true);
pizza.setPepperoni(true);
pizza.setBacon(true);

El problema aquí es que debido a que el objeto es creado a lo largo de varias llamadas puede ser en un estado incoherente a mitad de camino a través de su construcción. Esto también requiere una gran cantidad de esfuerzo adicional para garantizar la seguridad de los subprocesos.

La mejor alternativa es utilizar el Generador de Patrón.

public class Pizza {
  private int size;
  private boolean cheese;
  private boolean pepperoni;
  private boolean bacon;

  public static class Builder {
    //required
    private final int size;

    //optional
    private boolean cheese = false;
    private boolean pepperoni = false;
    private boolean bacon = false;

    public Builder(int size) {
      this.size = size;
    }

    public Builder cheese(boolean value) {
      cheese = value;
      return this;
    }

    public Builder pepperoni(boolean value) {
      pepperoni = value;
      return this;
    }

    public Builder bacon(boolean value) {
      bacon = value;
      return this;
    }

    public Pizza build() {
      return new Pizza(this);
    }
  }

  private Pizza(Builder builder) {
    size = builder.size;
    cheese = builder.cheese;
    pepperoni = builder.pepperoni;
    bacon = builder.bacon;
  }
}

Tenga en cuenta que la Pizza es inmutable y que los valores de los parámetros están todos en un solo lugar. Debido a que el Generador de los métodos setter devolver el Constructor de objetos que son capaces de estar encadenados.

Pizza pizza = new Pizza.Builder(12)
                       .cheese(true)
                       .pepperoni(true)
                       .bacon(true)
                       .build();

Esto se traduce en un código que es fácil de escribir y muy fácil de leer y entender. En este ejemplo, el método de construcción podría ser modificado para comprobar los parámetros después de que se han copiado desde el generador a la Pizza objeto y producir una IllegalStateException si un parámetro no válido valor ha sido suministrado. Este modelo es flexible y es muy fácil agregar más parámetros a ella en el futuro. Es realmente sólo es útil si usted va a tener más de 4 o 5 parámetros para un constructor. Dicho esto, podría ser que vale la pena, en primer lugar, si usted sospecha que usted puede agregar más parámetros en el futuro.

He tomado prestado pesadamente sobre este tema en el libro Efectiva de Java, 2da Edición por Joshua Bloch. Para aprender más acerca de este patrón y otros efectivos de Java prácticas se los recomiendo.

300voto

Tetha Puntos 2570

Considere la posibilidad de un restaurante. La creación de "hoy en día la comida" es un patrón de fábrica, porque decirle a la cocina "dame hoy la comida" y la cocina (de fábrica) decide qué objeto generar, con base en oculto criterios.

El constructor aparece si pides una pizza personalizada. En este caso, el camarero le dice el chef (el constructor) "necesito una pizza; agregue el queso, la cebolla y el tocino!" Por lo tanto, el constructor expone los atributos de los objetos generados deben tener, pero oculta cómo se establecen.

231voto

JoshBerke Puntos 34238

La diferencia clave entre un generador y la fábrica en mi humilde opinión, es que un generador es útil cuando usted necesita para hacer un montón de cosas para construir un objeto. Por ejemplo imaginemos un DOM. Tienes que crear un montón de nodos y atributos para conseguir su objeto final. Una fábrica se utiliza cuando la fábrica puede crear el objeto en su totalidad, dentro de una llamada a un método.

Un ejemplo de uso de un generador es un edificio de un documento XML, he utilizado este modelo cuando la construcción de fragmentos de HTML, por ejemplo, podría tener un Generador para la construcción de un tipo específico de la tabla y puede tener los siguientes métodos (parámetros no se muestra):

BuildOrderHeaderRow()
BuildLineItemSubHeaderRow()
BuildOrderRow()
BuildLineItemSubRow()

Este constructor luego de escupir el código HTML para mí. Esto es mucho más fácil de leer a continuación, caminando a través de un gran método de procedimiento.

Retirar el Generador de Patrón en la Wikipedia.

6voto

Dustin Puntos 35205

Se utiliza cuando usted tiene un montón de opciones para tratar con. Pensar en cosas como jmock:

m.expects(once())
    .method("testMethod")
    .with(eq(1), eq(2))
    .returns("someResponse");

Se siente mucho más natural y es...posible.

También hay xml edificio, la cadena de la construcción y muchas otras cosas. Imagínese si java.util.Map había puesto como un generador. Usted puede hacer cosas como esta:

Map<String, Integer> m = new HashMap<String, Integer>()
    .put("a", 1)
    .put("b", 2)
    .put("c", 3);

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X