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 Factory Method
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 Factory Method

Description

Le but du design pattern Factory Method est d’introduire une méthode abstraite de création d’un objet en déléguant aux sous-classes concrètes la création effective.

Exemple

Nous nous intéressons aux clients et aux commandes. La classe abstraite Client héberge la méthode creeCommande 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 creeCommande doit donc créer respectivement une instance de la classe CommandeComptant ou une instance de la classe CommandeCredit. Pour réaliser cette alternative, la méthode creeCommande est définie comme 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 creeCommande crée une instance de la classe CommmandeComptant.

  • La classe concrète ClientCredit dont la méthode creeCommande crée une instance de la classe CommmandeCredit.

Une telle conception est basée sur le design pattern Factory Method, la méthode creeCommande constituant la méthode de fabrique. L’exemple est détaillé à la figure 6.1.

Le design pattern Factory Method appliqué à des clients et à leurs commandes

Figure 6.1 - Le design pattern Factory Method appliqué à des clients et à leurs commandes

Structure

1. Diagramme de classes

La figure 6.2 détaille la structure générique du design pattern Factory Method

Structure du design pattern Factory Method

Figure 6.2 - Structure du design pattern Factory Method

2. Participants

Les participants au design pattern Factory Method sont les suivants :

  • CreateurAbstrait (AbstractClient) est une classe abstraite qui abrite la signature de la méthode de fabrique et l’implémentation de méthodes qui invoquent cette méthode de fabrique.

  • CreateurConcret (ClientComptant, ClientCredit) est une classe concrète qui implémente la méthode de fabrique. Il peut exister plusieurs créateurs concrets.

  • Produit (AbstractCommande) est une classe abstraite décrivant les propriétés communes des produits.

  • ProduitConcret (CommandeComptant, CommandeCredit) est une classe concrète décrivant complètement un produit.

3. Collaborations

Les méthodes concrètes de la classe CreateurAbstrait se basent sur l’implémentation de la méthode de fabrique dans les sous-classes. Cette implémentation crée une instance de la sous-classe adéquate de Produit.

Domaines d’utilisation

Le design pattern Factory Method 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 déléguer à ses sous-classes les choix d’instanciation en s’appuyant sur le mécanisme du polymorphisme.

Exemple en PHP

Le code source de la classe abstraite AbstractCommande et de ses deux sous-classes concrètes est donné à 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 décidé pour notre exemple de n’accepter que les commandes assorties d’un crédit dont la valeur se situe entre 1000 et 5000.

<?php 
 
declare(strict_types=1); 
 
namespace ENI\DesignPatterns\FactoryMethod; 
 
abstract class AbstractCommande 
{ 
   protected float $montant; 
 
   public function __construct(float $montant) 
   { 
       $this->montant = $montant; 
   } 
 
   abstract public function valide(): bool; 
 
   abstract public function paye(): void; 
} 
 
<?php 
 
declare(strict_types=1); 
 
namespace ENI\DesignPatterns\FactoryMethod; 
 
class CommandeComptant extends AbstractCommande 
{ 
   public function paye(): void 
   { 
       $montant = number_format($this->montant, 2, ',', ' '); 
       echo 'Paiement comptant de ' . $montant . ' effectué.'...