Patron Monteur
Fait partie de la section Programmation Orientée Objet du Journey Java de Coddy. Leçon 67 sur 87.
Le pattern Builder est un patron de conception créationnel qui résout un problème courant : construire des objets complexes avec de nombreux paramètres facultatifs. Au lieu de créer plusieurs constructeurs ou de transmettre null pour les paramètres inutilisés, le Builder vous permet de construire des objets étape par étape.
Imaginez créer un objet User avec des champs obligatoires (nom, e-mail) et des champs facultatifs (âge, téléphone, adresse). Sans Builder, vous auriez besoin de constructeurs télescopiques ou d’un constructeur peu pratique avec de nombreux paramètres. Le modèle Builder offre une approche plus claire :
public class User {
private final String name; // requis
private final String email; // requis
private final int age; // optionnel
private final String phone; // optionnel
private User(UserBuilder builder) {
this.name = builder.name;
this.email = builder.email;
this.age = builder.age;
this.phone = builder.phone;
}
public static class UserBuilder {
private final String name;
private final String email;
private int age;
private String phone;
public UserBuilder(String name, String email) {
this.name = name;
this.email = email;
}
public UserBuilder age(int age) {
this.age = age;
return this;
}
public UserBuilder phone(String phone) {
this.phone = phone;
return this;
}
public User build() {
return new User(this);
}
}
}Les méthodes du Builder renvoient this, ce qui permet le chaînage des méthodes : une manière fluide et lisible de construire des objets :
User user = new User.UserBuilder("Alice", "alice@email.com")
.age(25)
.phone("555-1234")
.build();Remarquez que le constructeur User est privé : les objets peuvent uniquement être créés par l’intermédiaire du Builder. Ce modèle est particulièrement utile lorsque les objets possèdent de nombreux champs facultatifs, ce qui rend votre code plus lisible et moins sujet aux erreurs que de longues listes de paramètres.
Défi
FacileConstruisons un système de commande de pizzas en utilisant le patron Builder ! Au lieu de gérer un constructeur qui accepte des dizaines de paramètres pour toutes les garnitures et options possibles, vous allez créer un builder fluide qui rend la personnalisation des pizzas claire et lisible.
Vous allez organiser votre code dans deux fichiers :
Pizza.java: créez une classePizzaqui utilise le patron Builder pour sa construction. Votre pizza doit posséder les champs suivants :size(String) - obligatoire, représente la taille de la pizzacheese(boolean) - facultatif, vaut false par défautpepperoni(boolean) - facultatif, vaut false par défautmushrooms(boolean) - facultatif, vaut false par défautLe constructeur de
Pizzadoit être privé et accepter uniquement unPizzaBuildercomme paramètre, en copiant toutes les valeurs du builder dans les champs de la pizza.Incluez une méthode
getDescription()qui renvoie une chaîne dans ce format :[size] Pizza with: [toppings], où toppings est une liste séparée par des virgules des garnitures dont la valeur est true (Cheese, Pepperoni, Mushrooms). Si aucune garniture n'est sélectionnée, la partie toppings doit simplement indiquerno toppings.Créez une classe interne statique
PizzaBuilderavec :- Un constructeur qui accepte le paramètre obligatoire
size - Les méthodes
cheese(),pepperoni()etmushrooms(), qui définissent chacune la valeur booléenne correspondante sur true et renvoientthispour permettre l'enchaînement - Une méthode
build()qui renvoie une nouvelle instance dePizza
- Un constructeur qui accepte le paramètre obligatoire
Main.java: mettez votre builder de pizza à l'épreuve ! Vous recevrez quatre entrées : la taille de la pizza (String) et trois valeurs yes/no (Strings) indiquant respectivement s'il faut ajouter du fromage, du pepperoni et des champignons.Créez un
PizzaBuilderavec la taille donnée. Ensuite, en fonction de chaque entrée yes/no, enchaînez les méthodes de garniture appropriées. Si l'entrée est"yes", appelez la méthode de cette garniture ; si elle est"no", ignorez-la. Enfin, appelezbuild()pour créer votre pizza.Affichez le résultat de l'appel à
getDescription()sur votre pizza terminée.
Vous recevrez quatre entrées dans l'ordre suivant : taille (String), ajouter du fromage (String : "yes" ou "no"), ajouter du pepperoni (String : "yes" ou "no"), ajouter des champignons (String : "yes" ou "no").
Par exemple, avec les entrées Large, yes, no, yes, votre sortie serait : Large Pizza with: Cheese, Mushrooms
Remarquez comment le patron Builder vous permet de construire des pizzas avec n'importe quelle combinaison de garnitures sans avoir besoin de constructeurs distincts pour chaque possibilité !
Essayez vous-même
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Lire les entrées
String size = scanner.nextLine();
String addCheese = scanner.nextLine();
String addPepperoni = scanner.nextLine();
String addMushrooms = scanner.nextLine();
// TODO: Créer un PizzaBuilder avec la taille donnée
// TODO: Enchaîner les méthodes de garniture selon les entrées oui/non
// TODO: Construire la pizza et afficher sa description
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe mot-clé thisMéthodesChamps (Attributs)Méthode constructeurSurcharge de constructeurRécapitulatif - Calculatrice simple4Héritage
Héritage de base (extends)Le mot-clé superRedéfinition de méthode (@Override)Chaînage de constructeursLa classe ObjectHéritage simple et multiniveauPourquoi pas d'héritage multiple de classesRécapitulatif - Hiérarchie des employés7Méthodes spéciales et classe Object
Méthode toString()equals() et hashCode()Méthode clone()compareTo() et ComparableInterface ComparatorRécapitulatif - Tri personnalisé2Modificateurs d'accès et Encapsulation
Aperçu des niveaux d'accèsMéthodes Getter et SetterMasquage d'informationsLe mot-clé finalRécapitulatif - Gestionnaire de compte bancaire5Polymorphisme
Bases de la surcharge de méthodesRedéfinition de méthodes (Run-Time)Upcasting et DowncastingL'opérateur instanceofClasses et méthodes abstraitesRécapitulatif - Calculateur de formes8Concepts avancés de la POO
Composition vs HéritageAgrégation vs CompositionClasses internes, imbriquées et anonymesEnums et méthodes d'EnumRecords (Java 16+)Classes scellées (Java 17+)11Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron MonteurPatron ObservateurPatron Stratégie3Propriétés de classe et membres statiques
Variables d'instance vs variables statiquesMéthodes statiquesBlocs statiquesConstantes (static final)Récapitulatif - Compteur et utilitaire6Interfaces et Classes Abstraites
Introduction aux InterfacesImplémentation d'InterfacesImplémentation d'Interfaces MultiplesDefault et Static dans les InterfacesClasses Abstraites vs InterfacesInterfaces FonctionnellesRécapitulatif - Système de Paiement9La généricité
Introduction à la généricitéClasses génériquesMéthodes génériquesParamètres de type bornésWildcards (?, extends, super)Récapitulatif - Conteneur générique12Patrons de conception, partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Template MethodPatron ÉtatPatron CompositePatron ItérateurEntraînez-vous par vous-même : Compilateur Java en ligne