Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Patrones de Diseño Creacionales

Builder

Construir objetos complejos paso a paso

Universidad Nacional de Rio Negro - Sede Andina

Definición

El patrón Builder (Constructor) es un patrón de diseño creacional que permite construir objetos complejos paso a paso. El patrón permite producir distintos tipos y representaciones de un objeto utilizando el mismo código de construcción.

A diferencia de otros patrones creacionales, el Builder no requiere que los productos tengan una interfaz común, ya que los procesos de construcción pueden variar significativamente entre productos.

Origen e Historia

Al igual que el resto de los patrones clásicos, fue documentado por el GoF en 1994. Se inspiró en los procesos de fabricación industriales donde un objeto se ensambla a partir de componentes menores siguiendo un orden específico, permitiendo que el mismo proceso de ensamblaje pueda producir diferentes resultados finales.

Motivacion

La motivación surge ante el problema del “constructor telescópico”. Cuando una clase tiene muchos parámetros opcionales, el constructor se vuelve difícil de manejar y leer.

// Ejemplo de constructor telescópico (Inconveniente)
public Casa(int h, int b, boolean p, boolean g, boolean s, boolean t) { ... }

El Builder resuelve esto permitiendo que el cliente llame solo a los métodos que necesita para configurar las partes que le interesan del objeto.

Contexto

Se utiliza cuando:

Cuando aplica

Cuando no aplica

Consecuencias de su uso

Positivas

Negativas

Alternativas

Estructura

Diagramas

Diagrama de Clases

Diagrama de Secuencia

Ejemplos

/**
 * Clase a construir.
 */
public class Casa {
    private int habitaciones;
    private int baños;
    private boolean piscina;
    private boolean garaje;
    
    private Casa(CasaBuilder builder) {
        this.habitaciones = builder.habitaciones;
        this.baños = builder.baños;
        this.piscina = builder.piscina;
        this.garaje = builder.garaje;
    }
    
    public static class CasaBuilder {
        private int habitaciones = 0;
        private int baños = 0;
        private boolean piscina = false;
        private boolean garaje = false;
        
        public CasaBuilder habitaciones(int cantidad) {
            this.habitaciones = cantidad;
            return this;
        }
        
        public CasaBuilder baños(int cantidad) {
            this.baños = cantidad;
            return this;
        }
        
        public CasaBuilder conPiscina() {
            this.piscina = true;
            return this;
        }
        
        public Casa construir() {
            return new Casa(this);
        }
    }
}

// Uso fluido:
Casa miCasa = new Casa.CasaBuilder()
    .habitaciones(3)
    .baños(2)
    .conPiscina()
    .construir();

Ejercicios

Resumen

El Builder es el patrón ideal para “ensamblar” objetos. Su mayor virtud es la legibilidad y la flexibilidad que aporta al cliente, permitiéndole construir objetos complejos sin perderse en una maraña de parámetros de constructor. Es especialmente popular en Java moderno a través de bibliotecas como Lombok o en la construcción de APIs fluidas.

Próximo paso

Para seguir, conviene pasar a el material siguiente, donde el recorrido continúa sobre esta base.