Sobes.tech
Middle

Kas ir Factory dizaina paraugs un kā tas tiek izmantots objektu (Builder) būvniecībā?

sobes.tech AI

Atbilde no AI

Factory Method šablons nodrošina saskarni objektu izveidei pamata klases, ļaujot apakšklasēm mainīt izveidojamo objektu tipu. ConcreteFactory lemj, kuru ConcreteProduct izveidot.

Builder atdala sarežģīta objekta būvniecību no tā attēlojuma. Tas ļauj pakāpeniski veidot objektu, nodrošinot dažādas metodes tā īpašību noteikšanai un atgriežot gatavu objektu. To izmanto, kad objekts ir ar daudzām izvēles parametriem un tā izveide prasa sarežģītu loģiku.

Fabrika veido pilnus objektus, bet Būvētājs – pa daļām.

Piemērs:

// 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 izmantošana
val pizza = Pizza.Builder()
    .size("large")
    .cheese(true)
    .pepperoni(true)
    .build()

println(pizza)

Salīdzinājums:

Īpašība Factory Method Builder
Mērķis Objektu izveide, izmantojot apakšklases. Sarežģītu objektu pakāpeniska izveide.
Objekta sarežģītība Parasti vienkārši objekti. Sarežģīti objekti ar daudzām parametru iespējām.
Izveides elastība Objekta veida izvēle atkarīga no apakšklases. Pakāpeniska objekta īpašību konfigurācija.
Objekta atgriešana Gatavs objekts. Gatavs objekts pēc būvniecības pabeigšanas.
Lietojums Frameworks, bibliotēkas, kur objekta tips nav zināms kompilācijas laikā. Objekti ar daudzām nevēlamām parametru iespējām.