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. |