Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
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 Factory Method
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 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.

images/figure36.PNG

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.

images/figure37.PNG

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 Java

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.

public abstract class Commande 
{ 
  protected double montant; 
 
  public Commande(double montant) 
  { 
    this.montant = montant; 
  } 
  public abstract boolean valide(); 
  public abstract void paye(); 
} 
 
public class CommandeComptant extends Commande 
{ 
  public CommandeComptant(double montant) 
  { 
    super(montant); 
  } 
 
  public void paye() 
  { 
    System.out.println( 
      "Le paiement de la commande au comptant de : " + 
      montant + " est effectué."); 
  } 
 
  public boolean valide() 
  { 
    return true; 
  } ...