El patrón Builder es una poderosa herramienta en el diseño de software que facilita la creación de instancias complejas de objetos. Al integrarlo eficientemente en nuestro código, podemos gestionar parámetros opcionales y obtener un diseño más limpio y robusto. En este ejemplo, veremos su implementación en un proyecto de software.
¿Qué cambios hacer en la capa de datos?
Comenzaremos por crear una nueva clase que representará al usuario y su contraseña, ubicándola en la capa de datos.
class User {privatevar gitUsername: String
privatevar password: String
// Inner class for the Builder patternclass Builder {privatevar username: String?=nullprivatevar password: String?=nullfunsetUsername(newUsername: String): Builder {this.username = newUsername
returnthis}funsetPassword(newPassword: String): Builder {this.password = newPassword
returnthis}funbuild(): User {returnUser(username ?:"", password ?:"")}}}
Aquí hemos creado una clase User con una clase interna Builder, que permitirá construir instancias de User de manera flexible y eficiente. El Builder maneja los parámetros opcionales, permitiendo instancias completas con configuraciones específicas.
¿Cómo asegurar que el constructor sea privado?
Queremos restringir la creación directa de instancias de User para asegurar el uso del patrón Builder. Esto se logra estableciendo como private el constructor de la clase User.
class User privateconstructor(val username: String,val password: String){// Inner class para el patrón Builderclass Builder {// Métodos setUsername y setPassword// Métodos build}}
De esta manera, los desarrolladores están forzados a usar el Builder para crear instancias de User, manteniendo así el código más limpio y ordenado.
¿Qué ventajas tiene usar el patrón Builder?
Las ventajas son varias:
Flexibilidad: Permite crear objetos con distintos conjuntos de parámetros.
Legibilidad del código: Mejora la comprensión al separar la construcción y representación de un objeto.
Robustez: Minimiza errores de construcción por configuraciones defectuosas o incompletas.
¿Cómo gestionar múltiples parámetros en una clase?
En proyectos grandes, es común encontrarse con clases que requieren muchos parámetros. Un ejemplo de aplicación del patrón Builder se encuentra en la clase TransferAccount, donde se implementa efectivamente:
class TransferAccount privateconstructor(val userId: String,val profilePhoto: String,val heritage: String,// otros parámetros){class Builder {// Variables y métodos set para cada parámetrofunbuild(): TransferAccount {// Crear una instancia de TransferAccount}}}
Aquí vemos cómo manejar múltiples parámetros, algunos de los cuales pueden ser obligatorios, utilizando un Builder. La función apply se usa para aumentar la claridad y concisión al definir los parámetros.
Impleméntalo, prueba distintas configuraciones en tu proyecto, y observa cómo mejora la estructura y funcionalidad del código. ¡Sigue aprendiendo y desarrollando tus habilidades de programación!
Nunca me habían explicado este patrón de diseño tan bien, la verdad me parece que es muy útil, está genial.
Es muy buena la forma de explicar de Cristian, ya que luego de tocar el código hace una revisión donde lo explica nuevamente muy tranquilo, he entendido cosas que no entendía de otros cursos de la carrera Android (la estoy haciendo toda)
Al colocal el contructor en private no podemos instancia la clase sino atraves de builder
Kotlin ya nos da la posibilidad de tener parámetros opcionales, así que no veo mucho la ayuda del builder. 🤔
Si, exactamente, por esa razón también existe la lectura de la inline function apply que realmente es un builder. La idea con el curso es mostrar la base del patrón de diseño, por eso implementamos un builder, para que se entienda que pasa realmente.