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 ConstructeurLiasseVéhiculeHtml et, dans le second cas, une instance de la classe ConstructeurLiasseVé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.
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.
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 C#
Nous introduisons le petit exemple d’utilisation du pattern écrit en C#. Le code C# 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.
using System;
using System.Collections.Generic;
public abstract class Liasse
{
protected IList<string> contenu =
new List<string>();
public abstract void ajouteDocument(string document);
public abstract void imprime();
}
using System;
public class LiasseHtml : Liasse
{
public override void ajouteDocument(string document)
{
if (document.StartsWith("<HTML>"))
contenu.Add(document);
}
public override void imprime()
{
Console.WriteLine("Liasse HTML");
foreach (string s in contenu)
Console.WriteLine(s);
}
}
using System;
public class LiassePdf : Liasse
{
public override void ajouteDocument(string document)
{
...