Sobes.tech
Middle

Паттерни тарҳи Factory чист ва чӣ гуна дар сохтмони объектҳо (Builder) истифода мешавад?

sobes.tech AI

Ҷавоб аз AI

Модели Factory Method пешниҳод мекунад интерфейс барои эҷоди объектҳо дар синфи асосӣ, имкон медиҳад, ки субсинфҳо навъҳои объектҳои эҷодшударо тағир диҳанд. ConcreteFactory қарор мекунад, ки кадом ConcreteProduct-ро эҷод кунад.

Builder ҷудо мекунад сохтани объектҳои мураккаб аз намоиши онҳо. Он имкон медиҳад, ки объектро қадам ба қадам эҷод кунед, усулҳои гуногун барои муайян кардани хусусиятҳои он пешниҳод мекунад ва объектро тайёр бармегардонад. Он вақте истифода мешавад, ки объект дорои бисёр параметрҳои ихтиёрӣ аст ва эҷоди он талаботи логикаи мураккабро дорад.

Фабрика тамоми объектҳоро месозад, дар ҳоле ки Тарҳрези он онҳоро ба қисмҳо тақсим мекунад.

Мисол:

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

    override fun onClick() {
        println("Клик дар тугмаи Windows")
    }
}

class HTMLButton : Button {
    override fun render() {
        println("Рендер кардани тугмаи HTML")
    }

    override fun onClick() {
        println("Клик дар тугмаи 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 = "миёна",
        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
val pizza = Pizza.Builder()
    .size("боло")
    .cheese(true)
    .pepperoni(true)
    .build()

println(pizza)

Муқоиса:

Хусусиятҳо Factory Method Builder
Мақсад Эҷоди объектҳо тавассути субсинфҳо. Эҷоди қадам ба қадам объектҳои мураккаб.
Мушкилоти объект Одатан объектҳои оддӣ. Объектҳои мураккаб бо бисёр параметрҳо.
Иҷрои эҷод Интихоби навъи объект вобаста ба субсинф. Танзими қадам ба қадам хусусиятҳои объект.
Баргардонидани объект Вариъати тайёрро бармегардонад. Вариъати тайёрро пас аз анҷоми сохтмон бармегардонад.
Барнома Фреймворкҳо, китобхонаҳо, ки навъи объект дар вақти компиляция маълум нест. Объектҳо бо шумораи зиёди параметрҳои ихтиёрӣ.