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:
- Producto (Product): El objeto complejo que se va a construir.
- Builder: Una interfaz que define los métodos necesarios para construir las partes del Producto.
- 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:
- 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
Pizzarepresenta el objeto complejo que queremos construir. - Builder: La interfaz
PizzaBuilderdefine los pasos necesarios para construir una pizza, comosetMasa,setSalsaysetIngredientes. - Concrete Builder: La clase
PizzaMargaritaBuilderimplementa la interfazPizzaBuildery construye una pizza específica, en este caso, una Pizza Margarita. - Director: La clase
PizzaDirectorcontrola el proceso de construcción. En el métodomakeMargarita, 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
@Buildergenera un builder para la clasePersona, permitiendo construir objetos con una sintaxis fluida. - La anotación
@ToStringgenera automáticamente el métodotoString(), 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