Sobes.tech
Middle

Kas yra Factory dizaino šablonas ir kaip jis naudojamas objektų (Builder) statyboje?

sobes.tech AI

Atsakymas iš AI

Factory Method šablonas suteikia sąsają objektų kūrimui baziniame klasėje, leidžiant pogrupiams keisti kuriamų objektų tipą. ConcreteFactory nusprendžia, kokį ConcreteProduct sukurti.

Builder atskiria sudėtingo objekto konstravimą nuo jo reprezentacijos. Jis leidžia kurti objektą žingsnis po žingsnio, teikdamas įvairius metodus jo savybėms nustatyti ir grąžindamas paruoštą objektą. Jis naudojamas, kai objektas turi daugybę neprivalomų parametrų ir jo kūrimas reikalauja sudėtingos logikos.

Fabrikas sukuria objektus visiškai, o Statytojas – jų dalimis.

Pavyzdys:

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

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

println(pizza)

Palyginimas:

Savybė Factory Method Builder
Paskirtis Objektų kūrimas pagal pogrupio sąsają. Sudėtingų objektų etapinis kūrimas.
Objekto sudėtingumas Paprastai paprasti objektai. Sudėtingi objektai su daugybe parametrų.
Kūrimo lankstumas Objekto tipo pasirinkimas priklausomai nuo pogrupio. Žingsnis po žingsnio nustatant objekto savybes.
Objekto grąžinimas Paruošto objekto grąžinimas. Paruošto objekto grąžinimas po statybos pabaigos.
Naudojimas Framework'ai, bibliotekos, kur objektų tipas nežinomas kompiliacijos metu. Objektai su daugybe neprivalomų parametrų.