Implementación del Patrón Builder en Clases de Usuario

Clase 14 de 32Curso de Patrones de Diseño en Android

Resumen

¿Cómo aplicar el patrón Builder en el código?

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 {
    private var gitUsername: String
    private var password: String

    // Inner class for the Builder pattern
    class Builder {
        private var username: String? = null
        private var password: String? = null

        fun setUsername(newUsername: String): Builder {
            this.username = newUsername
            return this
        }

        fun setPassword(newPassword: String): Builder {
            this.password = newPassword
            return this
        }

        fun build(): User {
            return User(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 private constructor(val username: String, val password: String) {
    // Inner class para el patrón Builder
    class 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 private constructor(
    val userId: String,
    val profilePhoto: String,
    val heritage: String,
    // otros parámetros
) {
    class Builder {
        // Variables y métodos set para cada parámetro

        fun build(): 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!