Sobes.tech
Middle

Factory долбоорлоо үлгүсү эмне жана ал объекттерди курууда (Builder) кандай колдонулат?

sobes.tech AI

AIден жооп

Factory Method үлгүсү интерфейс камсыздайт объекттерди түзүү үчүн негизги класста, ал эми подкласстар түзүлүүчү объекттердин түрүн өзгөртүүгө мүмкүндүк берет. ConcreteFactory кайсы ConcreteProduct түзө турганын чечет.

Builder татаал объекттин курулушун анын көрсөтмөсүнөн бөлүп турат. Ал объектти кадам-кадам түзүүгө мүмкүндүк берет жана анын касиеттерин белгилөө үчүн ар кандай ыкмаларды сунуштайт жана даяр объектти кайтарат. Бул объекттин көптөгөн optional параметрлери бар жана анын түзүлүшү татаал логиканы талап кылганда колдонулат.

Фабрика бүт объекттерди түзөт, ал эми Түзүүчү алардын бөлүктөрүн түзөт.

Мисал:

// 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
Максат Төмөнкү класстар аркылуу объекттерди түзүү. Кыйынчылык менен түзүлгөн объекттерди кадам-кадам түзүү.
Объекттин татаалдыгы Адатта жөнөкөй объекттер. Көп параметрлүү кыйынчылык объекттер.
Түзүү ийкемдүүлүгү Объекттин түрүн тандоо подкласска негизделген. Объекттин касиеттерин кадам-кадам орнотуу.
Объект кайтаруу Дайын объект кайтарат. Түзүү аяктагандан кийин даяр объект кайтарат.
Колдонуу чөйрөсү Фреймворк, китепканалар, объекттин түрү алдын ала белгилүү эмес. Көптөгөн optional параметрлөрү бар объекттер.