Builder

Builder
Información sobre la plantilla
Builder.png
Concepto:Patrón que permite a un objeto (fuente) construir un objeto complejo especificando sólo su tipo

Builder. Patrón que permite a un objeto (fuente) construir un objeto complejo especificando sólo su tipo. El objeto constructor (fuente) se compone de una serie de partes que indivudualmente van formando el objeto complejo a través de un conjunto de llamadas a interfaces comunes de la clase Abstract Builder. Así se abstrae el proceso de creación del objeto complejo para que se puedan crear representaciones diferentes con el mismo proceso.

A menudo, el patrón builder construye el patrón Composite, un patrón estructural.

Intención: Abstrae el proceso de creación de un objeto complejo, centralizando dicho proceso en un único punto, de tal forma que el mismo proceso de construcción pueda crear representaciones diferentes.

Diagrama de Clases

Builder.png
  • Builder
    • interfaz abstracta para crear productos.
  • Concrete Builder
    • implementación del Builder
    • construye y reúne las partes necesarias para construir los productos
  • Director
    • construye un objeto usando el patrón Builder
  • Producto
    • El objeto complejo bajo construcción

Ventajas

  • Reduce el acoplamiento.
  • Permite variar la representación interna de estructuras compleja, respetando la interfaz común de la clase Builder.
  • Se independiza el código de construcción de la representación. Las clases concretas que tratan las representaciones internas no forman parte de la interfaz del Builder.
  • Cada ConcreteBuilder tiene el código especifico para crear y modificar una estructura interna concreta.
  • Distintos Director con distintas utilidades (visores, parsers, etc) pueden utilizar el mismo ConcreteBuilder.
  • Permite un mayor control en el proceso de creación del objeto. El Director controla la creación paso a paso, solo cuando el Builder ha terminado de construir el objeto lo recupera el Director.
  • Abstrae el proceso de creación de un objeto complejo, centralizando dicho proceso en un único punto.
public class BuildPattern {

        public void main(String args[]){
                MakeAMovie makeAMovie = new MakeAMovie(new Rambo());
                MakeAMovie.filmAMovie();
                Movie movie = makeAMovie.seeMovie();
                System.out.println(movie.genere);
                System.out.println(movie.name);
                System.out.println(movie.duration);
        }

public class Movie{
        public String name = "";
        public String genere = "";
        public int duration;
                
        public void setName(String name){
              this.name=name;
        }
        public void setGenere(String genere){
              this.genere=genere;
        }
        public void setDuration(int duration){
              this.duration=duration;
        }

}
        
abstract class BuilderMovieStudioAbstract{
        Movie movie;
                
        abstract void buildName();
        abstract void buildGenere();
        abstract void buildDuration();
                
        Movie getMovie(){return movie;}
        
}
        
public class Rambo extends BuilderMovieStudioAbstract{

        void buildDuration() {
              movie.setDuration(120);
        }
        void buildGenere() {
              movie.setGenere("Action");
        }
        void buildName() {
              movie.setName("Rambo");
        }
}
        
public class MakeAMovie{
        BuilderMovieStudioAbstract abstractMovie;
               
        public MakeAMovie(BuilderMovieStudioAbstract abstractMovie) {
              this.abstractMovie=abstractMovie;

        }
        public void filmAMovie(){
              abstractMovie.buildDuration();
              abstractMovie.buildName();
              abstractMovie.buildGenere();
        }
                
        public Movie seeMovie(){
              return abstractMovie.getMovie();
        }
}
}

Fuentes