Dans ce tutoriel, nous apprendrons, pourquoi et comment utiliser le patron de conception Monteur.
Dans un premier temps, nous expliquerons son rôle et son fonctionnement puis nous passerons à un exemple pratique ( Création d’une pizza à partir d’une commande).
Problématique
Une classe nécessite plusieurs opérations de création et d’initialisation pour chaque attribut dans un ordre prédéfini par les opérations. Chaque type d’instance nécessite différentes valeurs d’attributs.
Définition
L’objectif du pattern Monteur ( Builder ) est d’abstraire la construction d’objets complexes de leur implémentation de sorte qu’un client ( demandeur ) puisse créer ces objets complexes sans devoir se préoccuper des différences d’implémentation.
Exemple pratique
La Classe Directeur ( Caissier )
En fonction de la demande, le caissier assigne la création de la pizza à l’un de ses collègues.
# Director class Cashier(object): def __init__(self): self.pizzaBuilder = None def setPizzaBuilder(self, pizzaBuilder): print("Choix des aliments ...") self.pizzaBuilder = pizzaBuilder def getPizza(self): return self.pizzaBuilder.getPizza() def buildPizza(self): print("Construction de la pizza ...") self.pizzaBuilder.createNewPizza() self.pizzaBuilder.buildPate() self.pizzaBuilder.buildSauce() self.pizzaBuilder.buildGarnish() ...
La Classe Monteur ( Employé de cuisine )
La classe abstraite ( ne peut être instancié directement ) Elle définit les actions de base pour réaliser une pizza.
... class PizzaBuilder(object): pizza = None def getPizza(self): return self.pizza def createNewPizza(self): self.pizza = Pizza() def buildPate(self): pass def buildSauce(self): pass def buildGarnish(self): pass ...
La Classe Monteur Concret ( Employé en cuisine spécialisé )
La classe Monteur Concret définit les actions précises pour réaliser une pizza spécifique. ( Hawaienne ou Epicé ).
... # Concrete Builder class HawaiPizzaBuilder(PizzaBuilder): """ Employé expert de la pizza hawaienne """ def buildPate(self): self.pizza.setPate("short") def buildSauce(self): self.pizza.setSauce("sweet") def buildGarnish(self): self.pizza.setSauce("ham+pineapple") class SpicyPizzaBuilder(PizzaBuilder): """ Employé expert de la pizza épicé """ def buildPate(self): self.pizza.setPate("puff") def buildSauce(self): self.pizza.setSauce("spicy") def buildGarnish(self): self.pizza.setGarnish("pepperoni+salami") # Employé hawaiPizzaBuilder = HawaiPizzaBuilder() spicyPizzaBuilder = SpicyPizzaBuilder() ...
La Classe Produit ( Pizza )
Cette classe représente le modèle de la pizza qui sera créé ( produit instancié ). Ce produit doit avoir une pâte, une sauce et une garniture.
... class Pizza(object): pate = "" sauce = "" garnish = "" def __init__(self): print("*** Pizza instancié ***") def setPate(self, pate): self.pate = pate def setSauce(self, sauce): self.sauce = sauce def setGarnish(self, garnish): self.garnish = garnish ...
Test du patron de conception Monteur
... cashier = Cashier() response = input("Quelle pizza avez-vous choisi ? Tapez 1 pour L'hawaienne ou 2 pour l'épicé :") if response == 1: print("Ok pour l'hawaienne") # Le caissier envoie la commande en cuisine # L'expert de la pizza hawaienne va se charger de la préparer cashier.setPizzaBuilder(hawaiPizzaBuilder) else: print("Ok pour l'épicé") # Le caissier envoie la commande en cuisine # L'expert de la pizza épicé va se charger de la préparer cashier.setPizzaBuilder(spicyPizzaBuilder) # Construction de la pizza à travers le caissier # Pas de contact direct avec les employée en cuisine pour le client print("Votre pizza sera prếte dans 20 minutes ...") cashier.buildPizza() pizza = cashier.getPizza() print("Voici votre pizza: ", pizza) print("Bonne dégustation !!!")
Conclusion
Ce tutoriel se termine vous savez à présent pourquoi et comment utiliser le patron de conception Monteur.
Vous avez aimé le tutoriel ? une suggestion ou une remarque ? Laissez-moi un commentaire ci-dessous.