Sobes.tech
Middle

Mi az a Factory tervezési minta, és hogyan használják az objektumok (Builder) építésében?

sobes.tech MI

Válasz az MI-től

A Factory Method minta interfészt biztosít az objektumok létrehozásához az alap osztályban, lehetővé téve az alkosztályok számára, hogy megváltoztassák a létrehozott objektumok típusát. A ConcreteFactory dönti el, melyik ConcreteProduct-ot hozza létre.

A Builder elválasztja egy összetett objektum építését annak megjelenítésétől. Lehetővé teszi az objektum lépésenkénti létrehozását, különböző módszereket kínálva az tulajdonságainak beállítására, és visszaadja a kész objektumot. Akkor használják, amikor az objektumnak sok opcionális paramétere van, és a létrehozása összetett logikát igényel.

A Factory az egész objektumokat hozza létre, míg a Builder részekre bontja azokat.

Példa:

// 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("Windows gomb megjelenítése")
    }

    override fun onClick() {
        println("Windows gombra kattintás")
    }
}

class HTMLButton : Button {
    override fun render() {
        println("HTML gomb megjelenítése")
    }

    override fun onClick() {
        println("HTML gombra kattintás")
    }
}

// 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 = "közepes",
        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 használata
val pizza = Pizza.Builder()
    .size("nagy")
    .cheese(true)
    .pepperoni(true)
    .build()

println(pizza)

Összehasonlítás:

Jellemzők Factory Method Builder
Cél Objektumok létrehozása alosztályokon keresztül. Összetett objektumok lépésenkénti létrehozása.
Objektum összetettsége Általában egyszerű objektumok. Több paraméterrel rendelkező összetett objektumok.
Létrehozás rugalmassága Objektum típusának kiválasztása az alosztály szerint. Objektum tulajdonságainak lépésenkénti beállítása.
Objektum visszaadása Kész objektumot ad vissza. A létrehozás befejezése után adja vissza a kész objektumot.
Alkalmazás Keretrendszerek, könyvtárak, ahol az objektum típusa nem ismert fordítási időben. Nagy számú opcionális paraméterrel rendelkező objektumok.