Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
💥 Du 22 au 24 novembre : Accès 100% GRATUIT
à la Bibliothèque Numérique ENI. Je m'inscris !
  1. Livres et vidéos
  2. Design Patterns en PHP
  3. Le design pattern Builder
Extrait - Design Patterns en PHP Les 23 modèles de conception : descriptions et solutions illustrées en UML2 et PHP (2e édition)
Extraits du livre
Design Patterns en PHP Les 23 modèles de conception : descriptions et solutions illustrées en UML2 et PHP (2e édition)
2 avis
Revenir à la page d'achat du livre

Le design pattern Builder

Description

Le but du design pattern Builder est d’encapsuler la construction d’objets complexes de sorte qu’un client puisse créer ces objets sans devoir se préoccuper des différentes étapes nécessaires à leur construction.

Exemple

Lors de l’achat d’un véhicule, un vendeur crée une liasse de documents comprenant notamment le bon de commande et la demande d’immatriculation du client. Il peut construire ces documents au format HTML ou au format PDF selon le choix du client. Dans le premier cas, le client lui fournit une instance de la classe ConstructeurLiasseVehiculeHtml et, dans le second cas, une instance de la classe ConstructeurLiasseVehiculePdf. Le vendeur effectue ensuite la demande de création de chaque document de la liasse à cette instance.

Ainsi le vendeur crée les documents de la liasse à l’aide des méthodes construitBonDeCommande et construitDemandeImmatriculation.

L’ensemble des classes du design pattern Builder pour cet exemple est détaillé à la figure 5.1. Cette figure montre la hiérarchie des classes abstraites ConstructeurLiasseVehicule et Liasse. Le vendeur peut créer les bons de commande et les demandes d’immatriculation sans connaître les sous-classes de ConstructeurLiasseVehicule ni celles de Liasse.

Les relations de dépendance entre le client et les sous-classes de ConstructeurLiasseVehicule s’expliquent par le fait que le client crée une instance de ces sous-classes.

La structure interne des sous-classes concrètes de Liasse n’est pas montrée (dont, par exemple, la relation de composition avec...

Structure

1. Diagramme de classes

La figure 5.2 détaille la structure générique du design pattern Builder.

Structure du design pattern Builder

Figure 5.2 - Structure du design pattern Builder

2. Participants

Les participants au design pattern Builder sont les suivants :

  • ConstructeurAbstrait (AbstractConstructeurLiasseVehicule) est l’abstraction contenant les signatures des méthodes qui vont construire les différentes parties du produit ainsi que la signature de la méthode permettant d’obtenir le produit, une fois celui-ci construit.

  • ConstructeurConcret (ConstructeurLiasseVehiculeHtml et ConstructeurLiasseVehiculePdf) est la classe concrète implémentant les méthodes de ConstructeurAbstrait.

  • Produit (AbstractLiasse) est la classe définissant le produit. Elle peut être abstraite et posséder plusieurs sous-classes concrètes (LiasseHtml et LiassePdf) en cas d’implémentations différentes.

  • Directeur (Vendeur) est la classe chargée de construire le produit en utilisant l’interface exposée par ConstructeurAbstrait.

3. Collaborations

Le client crée un constructeur concret et un directeur. Le directeur construit sur demande du client en invoquant les méthodes adéquates du constructeur concret qu’on lui injecte puis renvoie le résultat final au client. La figure 5.3 illustre ce fonctionnement à travers un diagramme de séquence...

Domaines d’utilisation

Le design pattern Builder est utilisé dans les domaines suivants :

  • Un client a besoin de construire des objets complexes sans avoir à connaître les détails de leur implémentation.

  • Un client a besoin de construire des objets complexes ayant plusieurs représentations ou implémentations.

Exemple en PHP

Nous introduisons à présent l’exemple d’utilisation du design pattern Builder écrit en PHP. Le code PHP correspondant à la classe abstraite AbstractLiasse et ses sous-classes est donné à la suite. Par souci de simplification, les documents sont ici de simples chaînes de caractères pour les liasses au format HTML et PDF. La méthode imprime affiche les différentes chaînes de caractères qui représentent les documents.

<?php 
 
declare(strict_types=1); 
 
namespace ENI\DesignPatterns\Builder; 
 
abstract class AbstractLiasse 
{ 
   protected array $contenu; 
 
   abstract public function ajouteDocument(string $document): void; 
 
   abstract public function imprime(): void; 
} 
 
<?php 
 
declare(strict_types=1); 
 
namespace ENI\DesignPatterns\Builder; 
 
class LiasseHtml extends AbstractLiasse 
{ 
   public function ajouteDocument(string $document): void 
   { 
       if (str_starts_with($document, '<HTML>')) { 
           $this->contenu[] = $document; 
       } 
   } 
 
   public function imprime(): void 
   { 
       echo 'Liasse HTML' . PHP_EOL; 
 
       foreach ($this->contenu as $ligne) { 
           echo $ligne . PHP_EOL; 
       } ...