Blog ENI : Toute la veille numérique !
-25€ dès 75€ sur les livres en ligne, vidéos... avec le code FUSEE25. J'en profite !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Design Patterns en Java
  3. Le pattern Builder
Extrait - Design Patterns en Java Descriptions et solutions illustrées en UML 2 et Java (5e édition) - Les 23 modèles de conception
Extraits du livre
Design Patterns en Java Descriptions et solutions illustrées en UML 2 et Java (5e édition) - Les 23 modèles de conception Revenir à la page d'achat du livre

Le pattern Builder

Description

Le but du pattern Builder est d’abstraire la construction d’objets complexes de leur implantation de sorte qu’un client puisse créer ces objets complexes sans devoir se préoccuper des différences d’implantation.

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 CréateurLiasseVéhiculeHtml et, dans le second cas, une instance de la classe CréateurLiasseVéhiculePdf. 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 pattern Builder pour cet exemple est détaillé à la figure 2-3.1. Cette figure montre la hiérarchie des classes ConstructeurLiasseVéhicule et Liasse. Le vendeur peut créer les bons de commande et les demandes d’immatriculation sans connaître les sous-classes de ConstructeurLiasseVéhicule ni celles de Liasse.

Les relations de dépendance entre le client et les sous-classes de ConstructeurLiasseVéhicule 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...

Structure

1. Diagramme de classes

La figure 2-3.2 détaille la structure générique du pattern.

images/figure34.PNG

Figure 2-3.2 - Structure du pattern Builder

2. Participants

Les participants au pattern sont les suivants :

  • ConstructeurAbstrait (ConstructeurLiasseVéhicule) est la classe introduisant les signatures des méthodes construisant 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 (ConstructeurLiasseVéhiculeHtml et ConstructeurLiasseVéhiculePdf) est la classe concrète implantant les méthodes du constructeur abstrait.

  • Produit (Liasse) 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’implantations différentes.

  • Directeur est la classe chargée de construire le produit au travers de l’interface du constructeur abstrait.

3. Collaborations

Le client crée un constructeur concret et un directeur. Le directeur construit sur demande du client en invoquant le constructeur et renvoie le résultat au client. La figure 2-3.3 illustre ce fonctionnement avec un diagramme de séquence UML.

images/figure35.PNG

Figure 2-3.3 - Diagramme de séquence du pattern Builder

Domaines d’utilisation

Le pattern est utilisé dans les domaines suivants :

  • Un client a besoin de construire des objets complexes sans connaître leur implantation.

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

Exemple en Java

Nous introduisons le petit exemple d’utilisation du pattern écrit en Java. Le code Java correspondant à la classe abstraite Liasse et ses sous-classes est donné à la suite. Par souci de simplification, les documents sont des 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.

import java.util.*; 
 
public abstract class Liasse 
{ 
  protected List<String> contenu = 
          new ArrayList<String>(); 
 
  public abstract void ajouteDocument(String document); 
  public abstract void imprime(); 
} 
 
public class LiasseHtml extends Liasse 
{ 
  public void ajouteDocument(String document) 
  { 
    if (document.startsWith("<HTML>")) 
      contenu.add(document); 
  } 
 
  public void imprime() 
  { 
    System.out.println("Liasse HTML"); 
    for (String s: contenu) 
      System.out.println(s); 
  } 
} 
 
public class LiassePdf extends Liasse 
{ 
  public void ajouteDocument(String document) 
  { 
    if (document.startsWith("<PDF>")) 
      contenu.add(document); ...