---
title: Patrón Builder
description: "El patrón de diseño **Builder** es un patrón creacional que se utiliza para construir objetos complejos de manera controlada y paso a paso. A diferencia de otros patrones de creación, el Builder separa la construcción del objeto de su representación, lo que…"
url: "https://samaniel.com/docs/patron-builder/"
updated: "2024-09-10"
category: Desarrollo / Patrones de diseño / Patrones creacionales
---

# Patrón Builder

El patrón de diseño **Builder** es un patrón creacional que se utiliza para construir objetos complejos de manera controlada y paso a paso. A diferencia de otros patrones de creación, el Builder separa la construcción del objeto de su representación, lo que permite crear diferentes representaciones de un objeto utilizando el mismo proceso de construcción. Este patrón es especialmente útil cuando un objeto puede tener múltiples configuraciones o cuando su construcción implica varios pasos que deben seguir un orden específico.

### ¿Cómo Funciona el Patrón Builder?

El patrón Builder se estructura generalmente en cuatro componentes clave:

1. **Producto (Product)**: El objeto complejo que se va a construir.
2. **Builder**: Una interfaz que define los métodos necesarios para construir las partes del Producto.
3. **Concrete Builder**: Implementa la interfaz Builder y construye la representación concreta del Producto.Imaginemos que estamos construyendo una pizza con diferentes configuraciones, como Pizza Margarita y Pizza Pepperoni. Aquí se muestra cómo implementar el patrón Builder en Java para este caso:
4. **Director**: Controla el proceso de construcción, orquestando el orden en que se invocan los métodos del Builder.

### Ejemplo Práctico: Construcción de una Pizza

Imaginemos que estamos construyendo una pizza con diferentes configuraciones, como Pizza Margarita y Pizza Pepperoni. Aquí se muestra cómo implementar el patrón Builder en Java para este caso:

Ventajas del uso de @Builder en Lombok:
Código más limpio y legible: No es necesario implementar manualmente el constructor, métodos setters o getters. Lombok se encarga de generar todo eso.
Inmutabilidad: Los objetos creados con el patrón Builder suelen ser inmutables, lo que aumenta la seguridad y consistencia en la gestión de datos.
Fluidez en la creación de objetos: Permite la creación de objetos de manera fluida, estableciendo solo los valores necesarios.

#### Explicación del Ejemplo

En este ejemplo, hemos construido una **Pizza** utilizando el patrón Builder.

- **Producto**: La clase `Pizza` representa el objeto complejo que queremos construir.
- **Builder**: La interfaz `PizzaBuilder` define los pasos necesarios para construir una pizza, como `setMasa`, `setSalsa` y `setIngredientes`.
- **Concrete Builder**: La clase `PizzaMargaritaBuilder` implementa la interfaz `PizzaBuilder` y construye una pizza específica, en este caso, una **Pizza Margarita**.
- **Director**: La clase `PizzaDirector` controla el proceso de construcción. En el método `makeMargarita`, se define cómo se construye una Pizza Margarita paso a paso.

El patrón **Builder** es un patrón de diseño creacional que permite construir objetos complejos paso a paso, proporcionando una interfaz fluida y flexible para configurar las propiedades de un objeto antes de su construcción final. Esto es particularmente útil cuando un objeto tiene muchos parámetros opcionales o configuraciones complejas, evitando la creación de múltiples constructores o un código con parámetros largos.

### Implementación del patrón Builder con **Lombok**

**Lombok** es una biblioteca para Java que reduce el código repetitivo mediante anotaciones. En el caso del patrón Builder, Lombok proporciona la anotación `@Builder`, la cual simplifica la implementación de este patrón al generar automáticamente el código necesario.

#### Ejemplo de uso del patrón Builder con Lombok

```
import lombok.Builder;
import lombok.ToString;

@Builder
@ToString
public class Persona {
    private String nombre;
    private int edad;
    private String direccion;
}
```

#### Creación de un objeto con el patrón Builder

```
public class Main {
    public static void main(String[] args) {
        Persona persona = Persona.builder()
                                .nombre("Juan")
                                .edad(30)
                                .direccion("Calle Falsa 123")
                                .build();
    }
}
```

#### Explicación

- La anotación `@Builder` genera un **builder** para la clase `Persona`, permitiendo construir objetos con una sintaxis fluida.
- La anotación `@ToString` genera automáticamente el método `toString()`, que facilita la impresión de los valores del objeto.

### Beneficios del Patrón Builder

- **Flexibilidad**: Puedes crear diferentes versiones de un objeto complejo usando el mismo código de construcción.
- **Claridad**: La separación de la construcción y la representación permite que el código sea más claro y manejable.
- **Control**: El Director garantiza que el objeto se construya de manera coherente y en el orden correcto

Código disponible en [Github](https://github.com/samaniel/design-patterns)
