Patrones de diseño: Builder | Builder design pattern

Repo: https://github.com/umarquez/100DaysOfC0D3/tree/master/27-builder-pattern

Se trata de un patrón creacional que nos ayuda a instanciar objetos complejos centralizando y reciclando los pasos para construir dichos objetos en una interfaz común, evitando reescribirlos en cada paquete o función que lo requiera.

Se compone de dos elementos principales

  • DIRECTOR: Quien se encarga de ejecutar cada proceso de instanciamiento.
  • BUILDER: La interfaz común que encapsula el proceso de creación de cada instancia

Pensemos en una línea de producción capaz de crear diferentes productos, por ejemplo, una máquina para fabricar galletas de diferentes tipos y sabores; podríamos pensar en los pasos generales que se necesitan para fabricar cualquier galleta AnyCookie:

  • Mezclar los ingredientes.
  • Distribuir en porciones.
  • Hornear durante el tiempo recomendado.
  • Enfriar y empacar.

Estos pasos pueden ser personalizados para cada receta y ser tan complejos internamente como sea necesario pero eso no alteraría la interfaz común, es decir, que siempre serán estos pasos en ese orden CookieBuilder.

Como podemos observar, cada método de la interfaz retorna el mismo builder con el fin de poder llamar a todos los métodos de creación de manera secuencial, excepto el último que retorna el producto final. De esta forma podríamos implementar algunas recetas agrupando los pasos necesarios dentro de cada método de la interfaz para que la máquina sea capaz de ejecutarlas, esos pasos retornarán un objeto que satisface a la interfaz AnyCookie.

Es importante mencionar que en este ejemplo no implementamos un único tipo Cookie que construiremos con cada builder, sino que definiremos cada tipo de galleta de manera independiente con el fin de demostrar que podemos construir diferentes tipos de objetos utilizando los métodos de la interfaz.

En el caso de la máquina de galletas (que funcionará como DIRECTOR), implementaremos el patrón singleton con el fin de asegurar una sola instancia de esta.

Siguiendo este método podríamos implementar recetas con diferentes niveles de complejidad y seguirlas construyendo a partir del DIRECTOR, simplemente implementando la interfaz común.

A continuación podremos encontrar el proyecto completo https://github.com/umarquez/100DaysOfC0D3/tree/master/27-builder-pattern

Salida