Sobes.tech
Middle

Qu'est-ce que le patron de conception 'constructeur' (Builder) ?

sobes.tech IA

Réponse de l'IA

Le patron "Builder" (Constructeur) est un patron de conception créatif destiné à créer des objets complexes étape par étape. Il sépare le processus de construction d'un objet complexe de sa représentation, de sorte que le même processus de construction peut créer différentes représentations.

Principes de fonctionnement :

  1. Séparation : Sépare la logique de création de l'objet de cet objet lui-même.
  2. Délégation : Le code client (Director) délègue la création de l'objet à une classe séparée (Builder).
  3. Construction étape par étape : L'objet est construit à partir de composants via un ensemble de méthodes du constructeur.

Participants principaux :

  • Produit : Objet complexe que nous voulons construire. Ne dépend pas du processus de création.
  • Builder : Interface abstraite définissant les étapes pour construire le Produit.
  • ConcreteBuilder : Implémentation concrète de Builder, réalisant les étapes de construction et fournissant une méthode pour obtenir le Produit fini.
  • Director (Optionnel) : Définit l'ordre d'appel des étapes de construction. Non obligatoire, le code client peut interagir directement avec ConcreteBuilder.

Avantages :

  • Permet de créer des objets avec de nombreux paramètres optionnels de manière plus lisible qu'avec des constructeurs à arguments multiples ou des chaînes de setters.
  • Permet de créer différentes variations d'un même objet en utilisant le même processus de construction.
  • Cache la structure interne de l'objet en cours de création.

Inconvénients :

  • Peut augmenter le nombre de classes dans le projet (Builder, ConcreteBuilder, Product, Director).

Exemple d'utilisation : Création d'un objet de la classe Pizza avec différents ingrédients.

// Produit
public class Pizza {
    private String dough;
    private String sauce;
    private String cheese;
    private List<String> toppings;

    public void setDough(String dough) { this.dough = dough; }
    public void setSauce(String sauce) { this.sauce = sauce; }
    public void setCheese(String cheese) { this.cheese = cheese; }
    public void setToppings(List<String> toppings) { this.toppings = toppings; }

    @Override
    public String toString() {
        return "Pizza avec pâte=" + dough + ", sauce=" + sauce + ", fromage=" + cheese + ", garnitures=" + toppings;
    }
}
// Builder
public interface PizzaBuilder {
    void buildDough();
    void buildSauce();
    void buildCheese();
    void addTopping(String topping);
    Pizza getPizza();
}
// ConcreteBuilder
public class MargheritaPizzaBuilder implements PizzaBuilder {
    private Pizza pizza;

    public MargheritaPizzaBuilder() {
        this.pizza = new Pizza();
        this.pizza.setToppings(new ArrayList<>()); // Initialisation de la liste
    }

    @Override
    public void buildDough() {
        pizza.setDough("Pâte fine");
    }

    @Override
    public void buildSauce() {
        pizza.setSauce("Sauce tomate");
    }

    @Override
    public void buildCheese() {
        pizza.setCheese("Mozzarella");
    }

    @Override
    public void addTopping(String topping) {
        // La Margherita n'ajoute pas de toppings, sauf les basiques
    }

    @Override
    public Pizza getPizza() {
        return this.pizza;
    }
}
// Directeur (Optionnel)
public class Kitchen {
    private PizzaBuilder pizzaBuilder;

    public void setPizzaBuilder(PizzaBuilder pb) {
        pizzaBuilder = pb;
    }

    public Pizza getPizza() {
        return pizzaBuilder.getPizza();
    }

    public void constructPizza() {
        pizzaBuilder.buildDough();
        pizzaBuilder.buildSauce();
        pizzaBuilder.buildCheese();
        // D'autres méthodes peuvent être appelées, par exemple addTopping() dans un autre builder
    }
}

Utilisation :

// Code client
Kitchen kitchen = new Kitchen();
PizzaBuilder margheritaBuilder = new MargheritaPizzaBuilder();

kitchen.setPizzaBuilder(margheritaBuilder);
kitchen.constructPizza();

Pizza margherita = kitchen.getPizza();
System.out.println(margherita); // Affiche : Pizza avec pâte=Pâte fine, sauce=Sauce tomate, fromage=Mozzarella, garnitures=[]