Sobes.tech
Middle

Ce este pattern-ul de proiectare Factory și cum este utilizat în construcția obiectelor (Builder)?

sobes.tech AI

Răspuns de la AI

Modelul Factory Method oferă o interfață pentru crearea obiectelor în clasa de bază, permițând subclasei să modifice tipul de obiecte create. ConcreteFactory decide ce ConcreteProduct să creeze.

Builder separă construcția unui obiect complex de reprezentarea sa. Permite crearea obiectului pas cu pas, oferind diferite metode pentru a-i seta proprietățile și returnând obiectul complet. Se folosește atunci când obiectul are multe parametri opționali și crearea sa necesită logică complexă.

Fabrica creează obiecte complete, în timp ce Builder le creează pe bucăți.

Exemplu:

// 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("Rendering Windows button")
    }

    override fun onClick() {
        println("Clicking Windows button")
    }
}

class HTMLButton : Button {
    override fun render() {
        println("Rendering HTML button")
    }

    override fun onClick() {
        println("Clicking HTML button")
    }
}

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

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

println(pizza)

Comparare:

Caracteristică Factory Method Builder
Scop Crearea obiectelor prin interfețe în subclase. Crearea pas cu pas a obiectelor complexe.
Complexitatea obiectului Obiecte de obicei simple. Obiecte complexe cu mulți parametri.
Flexibilitatea creării Alegerea tipului de obiect în funcție de subclasă. Configurarea progresivă a proprietăților obiectului.
Returnarea obiectului Returnează un obiect gata. Returnează un obiect după finalizarea construcției.
Aplicații Framework-uri, biblioteci, unde tipul obiectului nu este cunoscut în timpul compilării. Obiecte cu mulți parametri opționali.