Sobes.tech
Middle

Wat is het Factory-ontwerppatroon en hoe wordt het gebruikt bij het bouwen van objecten (Builder)?

sobes.tech AI

Antwoord van AI

Het Factory Method-patroon biedt een interface voor het maken van objecten in de basisklasse, waardoor subklassen het type van de gemaakte objecten kunnen wijzigen. ConcreteFactory bepaalt welke ConcreteProduct wordt gemaakt.

Builder scheidt de constructie van een complex object van zijn representatie. Het stelt je in staat om het object stapsgewijs te maken, door verschillende methoden te bieden om de eigenschappen ervan in te stellen en het volledige object terug te geven. Het wordt gebruikt wanneer het object veel optionele parameters heeft en de creatie ervan complexe logica vereist.

De fabriek maakt volledige objecten, terwijl de bouwer ze in delen maakt.

Voorbeeld:

// 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("Rendering Windows knop")
    }

    override fun onClick() {
        println("Klikken op Windows knop")
    }
}

class HTMLButton : Button {
    override fun render() {
        println("Rendering HTML knop")
    }

    override fun onClick() {
        println("Klikken op HTML knop")
    }
}

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

// Builder gebruiken
val pizza = Pizza.Builder()
    .size("large")
    .cheese(true)
    .pepperoni(true)
    .build()

println(pizza)

Vergelijking:

Kenmerk Factory Method Builder
Doel Objecten maken via interfaces in subklassen. Stapsgewijze creatie van complexe objecten.
Objectcomplexiteit Meestal eenvoudige objecten. Complexe objecten met veel parameters.
Flexibiliteit in creatie Objecttype afhankelijk van subklasse. Progressieve configuratie van objecteigenschappen.
Objectterugkeer Geeft een klaar object terug. Geeft een object terug na voltooiing van de bouw.
Toepassingen Frameworks, bibliotheken, waar het objecttype niet bekend is tijdens compilatie. Objecten met veel optionele parameters.