Sobes.tech
Middle

¿Qué es el patrón de diseño Factory y cómo se utiliza en la construcción de objetos (Builder)?

sobes.tech AI

Respuesta de la IA

El patrón Factory Method proporciona una interfaz para crear objetos en la clase base, permitiendo a las subclases cambiar el tipo de objetos creados. ConcreteFactory decide qué ConcreteProduct crear.

Builder separa la construcción de un objeto complejo de su representación. Permite crear el objeto paso a paso, proporcionando diferentes métodos para establecer sus propiedades y devolviendo el objeto completo. Se usa cuando el objeto tiene muchos parámetros opcionales y su creación requiere lógica compleja.

La fábrica crea objetos completos, mientras que el Constructor los crea por partes.

Ejemplo:

// Factory Method
interface Dialog {
    fun createButton(): Button
    fun render() {
        val okButton = createButton()
        okButton.render()
    }
}

class WindowsDialog : Dialog {
    override fun createButton(): Button {
        return WindowsButton()
    }
}

class WebDialog : Dialog {
    override fun createButton(): Button {
        return HTMLButton()
    }
}

interface Button {
    fun render()
    fun onClick()
}

class WindowsButton : Button {
    override fun render() {
        println("Renderizando botón de Windows")
    }

    override fun onClick() {
        println("Haciendo clic en el botón de Windows")
    }
}

class HTMLButton : Button {
    override fun render() {
        println("Renderizando botón HTML")
    }

    override fun onClick() {
        println("Haciendo clic en el botón HTML")
    }
}

// Builder
class Pizza private constructor(
    private val size: String,
    private val cheese: Boolean,
    private val pepperoni: Boolean,
    private val mushrooms: Boolean
) {
    data class Builder(
        var size: String = "medium",
        var cheese: Boolean = false,
        var pepperoni: Boolean = false,
        var mushrooms: Boolean = false
    ) {
        fun size(size: String) = apply { this.size = size }
        fun cheese(cheese: Boolean) = apply { this.cheese = cheese }
        fun pepperoni(pepperoni: Boolean) = apply { this.pepperoni = pepperoni }
        fun mushrooms(mushrooms: Boolean) = apply { this.mushrooms = mushrooms }
        fun build() = Pizza(size, cheese, pepperoni, mushrooms)
    }

    override fun toString(): String {
        return "Pizza(size='$size', cheese=$cheese, pepperoni=$pepperoni, mushrooms=$mushrooms)"
    }
}

// Uso del Builder
val pizza = Pizza.Builder()
    .size("large")
    .cheese(true)
    .pepperoni(true)
    .build()

println(pizza)

Comparación:

Característica Factory Method Builder
Propósito Crear objetos mediante interfaces en subclases. Creación paso a paso de objetos complejos.
Complejidad del objeto Generalmente objetos simples. Objetos complejos con múltiples parámetros.
Flexibilidad en creación Selección del tipo de objeto según la subclase. Configuración progresiva de las propiedades del objeto.
Retorno del objeto Devuelve un objeto listo. Devuelve un objeto listo tras la construcción.
Aplicación Frameworks, bibliotecas, donde el tipo de objeto no se conoce en tiempo de compilación. Objetos con muchos parámetros opcionales.