El patrón de diseño Builder en Java es un patron de diseño creacional. Permite separar la creación del objeto de su representación. En otras palabras, permite la creación del objeto paso a paso. Esto es especialmente util en objetos complejos.
¿Cuándo se debe usar el patrón Builder?
Imaginemos que tenemos un objeto con 8 atributos. Para crearlo necesitamos escribir un constructor con 8 argumentos. Pero ¿Qué pasa si no queremos usar los 8 atributos? ya que mandar null como parámetro es mala práctica ¿deberíamos crear un constructor para 7 y para cada combinación de parámetros existente? Para estos casos podemos aplicar el patron de diseño builder en Java
¿Cuáles son las ventajas de usar el patrón Builder?
- Flexibilidad: Permite la creación de objetos con el número de parametron deseado de manera natural.
- Facil lectura: La implementación de dicho patron es fácil de seguir y entender.
- Inmutabilidad: Es posible forzar la inmutabilidad una vez que el objeto a terminado de ser construido. Garantizando así la seguridad del hilo de posibles modificaciones no deseadas
¿Cómo se implementa el patrón Builder en Java?
Ya que los patrones de diseño con soluciones abstractas a proyectos recurrentes podemos adaptar nuestras implementaciones según el contexto en el que nos encontramos. Por esta razón aquí escribiremos 3 ejemplos de cómo implementar el patron de diseño builder en java
Patrón de diseño Builder con Java clasico
Esta es la manera clásica de crear el patron de diseño Builder en java. Lo primero que debemos notar son los atributos private final de nuestro objeto los métodos getter y la omisión de los métodos setter. Lo que hace inmutables los valores del mismo. Después podemos ver clase estática Builder que repite los mismos campos de la clase principal Product y cada atributo tiene un método para establecer información. Podemos ver el constructor que solo recibe el objeto builder. Y por último podemos el ver el método build que regrese un objeto de tipo Product
Ahora podemos ocupar el builder en Java de la siguiente forma. Creamos un objeto de tipo ProductBuilder lo que nos permite acceder a los métodos de asignación de valores de los atributos y al final llamamos al método Build para terminar la construcción de nuestro objeto.
Patron de diseño Builder Genérico con lambdas
Gracias a las lambdas podemos crear un builder genérico para poder usarlo con todos nuestros Objetos.
Este builder generico usa el metodo of() para asignar el tipo de dato y el metodo with para asignar el valor al atributo del objeto. El uso de este builder se ve elegante y amigable la lectura. Ademas de que brinda flexibilidad pero al basarse en los setters del objeto deja a un lado de la inmutabilidad.
Patron de Diseño Builder en Java con Lombok
Lombok es una libreria en Java que nos ayuda a eliminitar el codigo repetitivo mediante anotaciones. Entre sus muchas funciones nos da una manera de implementar el patron de diseño Builder de manera simple.
Tambien podemos usar la anotacion @Builder en los Records.
Patron de diseño Builder usando Records en Java
Los records nos llegaron a Java con la misíon de crear clases inmutables sin código boilerplate. Si queremos usar el patron de diseño Builder en Java podemos hacerlo de la siguiente forma:
En el codigo anterior podemos observar el metodo build que crear el objeto y metodo estatico build que regresa el objeto Builder para la poder acceder para a los metodos de asignación de valores.
Demostración
Conclusión
Ahora conocemos para que sirve el patron de diseño Builder y vimos que existenvarias maneras de implementarlo. Es importante conocer el contexto de nuestor proyecto para saber cual es la que mas se adapta a nuestras necesidades.