Sobes.tech
Middle

O que é o padrão de projeto Factory e como é utilizado na construção de objetos (Builder)?

sobes.tech IA

Resposta da IA

O padrão Factory Method fornece uma interface para criar objetos na classe base, permitindo que subclasses alterem o tipo de objetos criados. ConcreteFactory decide qual ConcreteProduct criar.

Builder separa a construção de um objeto complexo de sua representação. Ele permite criar o objeto passo a passo, fornecendo diferentes métodos para definir suas propriedades e retornando o objeto completo. É usado quando o objeto tem muitos parâmetros opcionais e sua criação requer lógica complexa.

A fábrica cria objetos inteiros, enquanto o construtor os cria por partes.

Exemplo:

// 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ão Windows")
    }

    override fun onClick() {
        println("Clicando no botão Windows")
    }
}

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

    override fun onClick() {
        println("Clicando no botão 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 do Builder
val pizza = Pizza.Builder()
    .size("large")
    .cheese(true)
    .pepperoni(true)
    .build()

println(pizza)

Comparação:

Característica Factory Method Builder
Propósito Criar objetos por meio de interfaces em subclasses. Criação passo a passo de objetos complexos.
Complexidade do objeto Geralmente objetos simples. Objetos complexos com múltiplos parâmetros.
Flexibilidade na criação Escolha do tipo de objeto dependendo da subclasse. Configuração progressiva das propriedades do objeto.
Retorno do objeto Retorna um objeto pronto. Retorna um objeto após a construção.
Aplicação Frameworks, bibliotecas, onde o tipo de objeto não é conhecido na fase de compilação. Objetos com muitos parâmetros opcionais.