Monteur, comment utiliser ce patron de conception avec Python

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.

Laisser un commentaire