Sobes.tech
Middle

Τι είναι το μοτίβο σχεδιασμού Factory και πώς χρησιμοποιείται στην κατασκευή αντικειμένων (Builder);

sobes.tech AI

Απάντηση από AI

Το μοτίβο Factory Method παρέχει ένα διεπαφή για τη δημιουργία αντικειμένων στη βασική κλάση, επιτρέποντας στις υποκλάσεις να αλλάζουν τον τύπο των δημιουργούμενων αντικειμένων. Η ConcreteFactory αποφασίζει ποιο ConcreteProduct θα δημιουργήσει.

Ο Builder διαχωρίζει τη κατασκευή ενός πολύπλοκου αντικειμένου από την παρουσίασή του. Επιτρέπει τη δημιουργία του αντικειμένου βήμα προς βήμα, παρέχοντας διάφορες μεθόδους για τον καθορισμό των ιδιοτήτων του και επιστρέφοντας το τελικό αντικείμενο. Χρησιμοποιείται όταν το αντικείμενο έχει πολλαπλές προαιρετικές παραμέτρους και η δημιουργία του απαιτεί πολύπλοκη λογική.

Η Factory δημιουργεί ολόκληρα αντικείμενα, ενώ ο 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
Σκοπός Δημιουργία αντικειμένων μέσω υποκλάσεων. Βήμα-βήμα δημιουργία πολύπλοκων αντικειμένων.
Πολυπλοκότητα αντικειμένου Συνήθως απλά αντικείμενα. Πολύπλοκα αντικείμενα με πολλαπλές παραμέτρους.
Ευελιξία δημιουργίας Επιλογή τύπου αντικειμένου ανάλογα με την υποκλάση. Βηματική ρύθμιση ιδιοτήτων αντικειμένου.
Επιστροφή αντικειμένου Επιστρέφει το έτοιμο αντικείμενο. Επιστρέφει το έτοιμο αντικείμενο μετά το τέλος κατασκευής.
Εφαρμογή Πλαίσια, βιβλιοθήκες, όπου ο τύπος του αντικειμένου είναι άγνωστος κατά τη μεταγλώττιση. Αντικείμενα με μεγάλο αριθμό προαιρετικών παραμέτρων.