Sobes.tech
Middle

Czym jest wzorzec projektowy Factory i jak jest używany w budowie obiektów (Builder)?

sobes.tech AI

Odpowiedź od AI

Wzorzec Factory Method zapewnia interfejs do tworzenia obiektów w klasie bazowej, umożliwiając podklasom zmianę typu tworzonych obiektów. ConcreteFactory decyduje, który ConcreteProduct utworzyć.

Builder oddziela konstruowanie złożonego obiektu od jego reprezentacji. Umożliwia tworzenie obiektu krok po kroku, dostarczając różne metody do ustawiania jego właściwości i zwracając gotowy obiekt. Jest używany, gdy obiekt ma wiele opcjonalnych parametrów i jego tworzenie wymaga złożonej logiki.

Fabryka tworzy pełne obiekty, podczas gdy Budowniczy tworzy je partiami.

Przykład:

// 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("Renderowanie przycisku Windows")
    }

    override fun onClick() {
        println("Kliknięcie przycisku Windows")
    }
}

class HTMLButton : Button {
    override fun render() {
        println("Renderowanie przycisku HTML")
    }

    override fun onClick() {
        println("Kliknięcie przycisku 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 = "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)"
    }
}

// Użycie Buildera
val pizza = Pizza.Builder()
    .size("large")
    .cheese(true)
    .pepperoni(true)
    .build()

println(pizza)

Porównanie:

Cecha Factory Method Builder
Cel Tworzenie obiektów przez interfejsy w podklasach. Stopniowe tworzenie złożonych obiektów.
Złożoność obiektu Zazwyczaj proste obiekty. Złożone obiekty z wieloma parametrami.
Elastyczność tworzenia Wybór typu obiektu w zależności od podklasy. Stopniowa konfiguracja właściwości obiektu.
Zwracany obiekt Zwraca gotowy obiekt. Zwraca obiekt po zakończeniu budowy.
Zastosowania Frameworki, biblioteki, gdy typ obiektu nie jest znany w czasie kompilacji. Obiekty z dużą ilością parametrów opcjonalnych.