Le pattern Factory Method
Description
Le but du pattern Factory Method est d’introduire une méthode abstraite de création d’un objet en reportant aux sous-classes concrètes la création effective.
Exemple
Nous nous intéressons aux clients et aux commandes. La classe Client introduit la méthode créeCommande qui doit créer la commande. Certains clients commandent un véhicule en payant au comptant et d’autres clients utilisent un crédit. En fonction de la nature du client, la méthode créeCommande doit créer une instance de la classe CommandeComptant ou une instance de la classe CommandeCrédit. Pour réaliser cette alternative, la méthode créeCommande est abstraite. Les deux types de clients sont distingués en introduisant deux sous-classes concrètes de la classe abstraite Client :
-
La classe concrète ClientComptant dont la méthode créeCommande crée une instance de la classe CommmandeComptant.
-
La classe concrète ClientCrédit dont la méthode créeCommande crée une instance de la classe CommmandeCrédit.
Une telle conception est basée sur le pattern Factory Method, la méthode créeCommande étant la méthode de fabrique. L’exemple est détaillé à la figure 2-4.1.
Figure 2-4.1 - Le pattern Factory Method appliqué à des clients et à leurs commandes
Structure
1. Diagramme de classes
La figure 2-4.2 détaille la structure générique du pattern.
Figure 2-4.2 - Structure du pattern Factory Method
2. Participants
Les participants au pattern sont les suivants :
-
CréateurAbstrait (Client) est une classe abstraite qui introduit la signature de la méthode de fabrique et l’implantation de méthodes qui invoquent la méthode de fabrique.
-
CréateurConcret (ClientComptant, ClientCrédit) est une classe concrète qui implante la méthode de fabrique. Il peut exister plusieurs créateurs concrets.
-
Produit (Commande) est une classe abstraite décrivant les propriétés communes des produits.
-
ProduitConcret (CommandeComptant, CommandeCrédit) est une classe concrète décrivant complètement un produit.
3. Collaborations
Les méthodes concrètes de la classe CréateurAbstrait se basent sur l’implantation de la méthode de fabrique dans les sous-classes. Cette implantation crée une instance de la sous-classe adéquate de Produit.
Domaines d’utilisation
Le pattern est utilisé dans les cas suivants :
-
Une classe ne connaît que les classes abstraites des objets avec lesquels elle possède des relations.
-
Une classe veut transmettre à ses sous-classes les choix d’instanciation en profitant du mécanisme de polymorphisme.
Exemple en C#
Le code source de la classe abstraite Commande et de ses deux sous-classes concrètes est à la suite. Le montant de la commande est passé en paramètre du constructeur de la classe. Si la validation d’une commande au comptant est systématique, nous avons le choix pour notre exemple de n’accepter que les commandes assorties d’un crédit dont la valeur se situe entre 1000 et 5000.
using System;
public abstract class Commande
{
protected double montant;
public Commande(double montant)
{
this.montant = montant;
}
public abstract bool valide();
public abstract void paye();
}
using System;
public class CommandeComptant : Commande
{
public CommandeComptant(double montant) : base(montant){}
public override void paye()
{
Console.WriteLine(
"Le paiement de la commande au comptant de : " +
montant + " est effectué.");
}
public override bool valide()
{
return true;
}
}
using System;
public class CommandeCredit : Commande
{ ...