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
Назначение Създаване на обекти чрез подкласове. Постепенно създаване на сложни обекти.
Сложност на обекта Обикновено прости обекти. Сложни обекти с множество параметри.
Гъвкавост при създаване Избор на тип обект в зависимост от подклас. Постепенно настройване на свойствата на обекта.
Връщане на обекта Връща готовия обект. Връща готовия обект след завършване на строежа.
Приложение Frameworks, библиотеки, където типът на обекта е неизвестен по време на компилация. Обекти с голям брой опционални параметри.