Sobes.tech
Middle

Qu'est-ce que le patron de conception Factory et comment est-il utilisé dans la construction d'objets (Builder) ?

sobes.tech IA

Réponse de l'IA

Le patron Factory Method fournit une interface pour créer des objets dans la classe de base, permettant aux sous-classes de modifier le type d'objets créés. ConcreteFactory décide quel ConcreteProduct créer.

Builder sépare la construction d'un objet complexe de sa représentation. Il permet de créer l'objet étape par étape, en fournissant différentes méthodes pour définir ses propriétés et en renvoyant l'objet complet. Il est utilisé lorsque l'objet a de nombreux paramètres optionnels et que sa création nécessite une logique complexe.

La fabrique crée des objets entiers, tandis que le constructeur les crée par parties.

Exemple:

// 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("Rendu du bouton Windows")
    }

    override fun onClick() {
        println("Clic sur le bouton Windows")
    }
}

class HTMLButton : Button {
    override fun render() {
        println("Rendu du bouton HTML")
    }

    override fun onClick() {
        println("Clic sur le bouton 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)"
    }
}

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

println(pizza)

Comparaison:

Caractéristique Factory Method Builder
But Créer des objets via des interfaces dans des sous-classes. Création étape par étape d'objets complexes.
Complexité de l'objet Objets généralement simples. Objets complexes avec de nombreux paramètres.
Flexibilité de création Choix du type d'objet selon la sous-classe. Configuration progressive des propriétés de l'objet.
Retour de l'objet Retourne un objet prêt. Retourne un objet après la construction.
Application Frameworks, bibliothèques, où le type d'objet n'est pas connu à la compilation. Objets avec beaucoup de paramètres optionnels.