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

Description

Le but du design pattern Abstract Factory est la création d’objets regroupés en familles sans avoir à connaître leurs classes concrètes.

Exemple

Le système de vente de véhicules gère des véhicules fonctionnant à l’essence et des véhicules fonctionnant à l’électricité. Cette gestion est confiée à l’objet Catalogue, à qui incombe la responsabilité de créer de tels objets.

Pour chaque produit, nous disposons d’une classe abstraite, d’une sous-classe concrète décrivant la version du produit fonctionnant à l’essence et d’une sous-classe concrète décrivant la version du produit fonctionnant à l’électricité. Par exemple, à la figure 4.1, pour l’objet scooter, il existe une classe abstraite Scooter et deux sous-classes concrètes : ScooterElectricite et ScooterEssence.

L’objet Catalogue peut utiliser ces sous-classes concrètes pour instancier les produits. Cependant, si par la suite de nouvelles familles de véhicules doivent être prises en compte (diesel ou hybride essence-électricité), les modifications à apporter à l’objet Catalogue peuvent s’avérer assez fastidieuses.

Le design pattern Abstract Factory résout ce problème en introduisant une interface FabriqueVehiculeInterface qui contient la signature des méthodes à utiliser pour créer chaque produit. Le type...

Structure

1. Diagramme de classes

La figure 4.2 détaille la structure générique du design pattern Abstract Factory

Structure du design pattern Abstract Factory

Figure 4.2 - Structure du design pattern Abstract Factory

2. Participants

Les participants au design pattern Abstract Factory sont les suivants :

  • FabriqueAbstraite (FabriqueVehiculeInterface) est une interface spécifiant les signatures des méthodes créant les différents produits.

  • FabriqueConcrete1, FabriqueConcrete2 (FabriqueVehicule- Electricite, FabriqueVehiculeEssence) sont les classes concrètes implémentant les méthodes créant les produits pour chaque famille de produits. Connaissant la famille et le produit, elles sont capables de créer une instance du produit pour cette famille.

  • ProduitAbstraitA et ProduitAbstraitB (AbstractScooter et AbstractAutomobile) sont les classes abstraites des produits indépendamment de leur famille. Les familles sont introduites dans leurs sous-classes concrètes.

  • Client (Catalogue) est la classe qui utilise l’interface FabriqueAbstraite

3. Collaborations

La classe Catalogue utilise une instance de l’une des fabriques concrètes pour créer ses produits au travers de l’interface exposée par FabriqueAbstraiteInterface

Il est recommandé de ne créer qu’une seule instance des fabriques concrètes, celle-ci pouvant être partagée...

Domaines d’utilisation

Le design pattern Abstract Factory est utilisé dans les domaines suivants :

  • Un système utilisant des produits a besoin d’être indépendant de la façon dont ces produits sont créés et regroupés.

  • Un système est paramétré par plusieurs familles de produits qui peuvent évoluer.

Exemple en PHP

Voici maintenant un exemple d’utilisation du design pattern écrit en PHP. Le code PHP correspondant à la classe abstraite AbstractAutomobile et ses sous-classes est donné à la suite. Il est très simple, il décrit les quatre propriétés des automobiles ainsi que la méthode afficheCaracteristiques qui permet de les afficher.

<?php 
 
declare(strict_types=1); 
 
namespace ENI\DesignPatterns\AbstractFactory; 
 
abstract class AbstractAutomobile 
{ 
   protected string $marque; 
 
   protected string $couleur; 
 
   protected int $puissance; 
 
   protected float $espace; 
 
   public function __construct(string $marque, string $couleur, 
int $puissance, float $espace) 
   { 
       $this->marque = $marque; 
       $this->couleur = $couleur; 
       $this->puissance = $puissance; 
       $this->espace = $espace; 
   } 
 
   abstract public function afficheCaracteristiques(): void; 
} 
 
 
<?php 
 
declare(strict_types=1); 
 
namespace ENI\DesignPatterns\AbstractFactory; 
 
class AutomobileElectricite extends AbstractAutomobile 
{ 
   public function afficheCaracteristiques(): void 
   { 
       echo "Automobile électrique - marque: $this->marque" 
           . ", couleur: $this->couleur" 
           . ", puissance: $this->puissance" 
           . ", espace: $this->espace" . PHP_EOL; 
   } 
} 
 
 
<?php 
 
declare(strict_types=1); 
 
namespace ENI\DesignPatterns\AbstractFactory; ...