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 Prototype
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 Prototype

Description

Le but du design pattern Prototype est la création de nouveaux objets par clonage d’objets existants.

Exemple

Lors de l’achat d’un véhicule, un client doit recevoir une liasse définie par un nombre précis de documents tels que le certificat de cession, la demande d’immatriculation ou encore le bon de commande. D’autres types de documents peuvent être ajoutés ou retirés à cette liasse en fonction des besoins de gestion ou bien des changements de réglementation.

Tout d’abord, nous créons un modèle de liasse qui est une instance de la classe LiasseVierge et qui contient les différents documents nécessaires, documents qui resteront vierges. Ainsi, nous définissons au niveau des instances le contenu précis de la liasse que doit recevoir un client et non au niveau des classes. L’ajout ou la suppression d’un document dans la liasse vierge n’imposera pas de modification dans sa classe.

Une fois cette liasse vierge introduite, nous procédons par clonage pour créer les nouvelles liasses. Chaque nouvelle liasse est créée en dupliquant tous les documents de la liasse vierge, qui constitue une sorte de modèle de base pour toutes les liasses qui seront créées.

Cette technique basée sur des objets disposant de la capacité de clonage utilise le design pattern Prototype, les documents constituant les différents prototypes.

La figure 7.1 illustre cette utilisation. La classe...

Structure

1. Diagramme de classes

La figure 7.2 détaille la structure générique du design pattern Prototype.

Structure du design pattern Prototype

Figure 7.2 - Structure du design pattern Prototype

2. Participants

Les participants au design pattern Prototype sont les suivants :

  • Client (AbstractLiasse, LiasseClient, LiasseVierge) est une classe composée d’un ensemble d’objets appelés prototypes, instances de la classe abstraite Prototype. La classe Client a besoin de dupliquer ces prototypes sans avoir à connaître ni la structure interne de Prototype ni la hiérarchie de ses sous-classes.

  • Prototype (AbstractDocument) est une classe abstraite d’objets capables de se dupliquer eux-mêmes. Elle expose la signature de la méthode duplique.

  • PrototypeConcret1 et PrototypeConcret2 (BonDeCommande, DemandeImmatriculation, CertificatCession) sont les sous-classes concrètes de Prototype qui définissent complètement un prototype et implémentent sa méthode duplique.

3. Collaboration

Le client demande à un ou plusieurs prototypes de se dupliquer eux-mêmes.

Domaines d’utilisation

Le design pattern Prototype est utilisé dans les domaines suivants :

  • Un système d’objets doit créer des instances sans connaître la hiérarchie des classes les décrivant.

  • Un système d’objets doit créer des instances de classes chargées dynamiquement.

  • Le système d’objets doit rester simple et ne pas inclure une hiérarchie parallèle de classes de fabrique.

Exemple en PHP

Le code source de la classe AbstractDocument et de ses sous-classes concrètes est donné à la suite. La méthode duplique utilise l’instruction clone fournie par PHP.

L’instruction clone de PHP nous évite de devoir recopier manuellement chaque attribut. Par conséquent, la méthode duplique peut être totalement implémentée au niveau de la classe AbstractDocument.

<?php 
 
declare(strict_types=1); 
 
namespace ENI\DesignPatterns\Prototype; 
 
abstract class AbstractDocument 
{ 
   protected string $contenu; 
 
   public function duplique(): self 
   { 
       return clone $this; 
   } 
 
   public function remplit(string $informations): void 
   { 
       $this->contenu = $informations; 
   } 
 
   abstract public function imprime(): void; 
 
   abstract public function affiche(): void; 
} 
 
<?php 
 
declare(strict_types=1); 
 
namespace ENI\DesignPatterns\Prototype; 
 
class BonDeCommande extends AbstractDocument 
{ 
   public function affiche(): void 
   { 
       echo "Affiche le bon de commande: $this->contenu" . 
PHP_EOL; 
   } 
 
   public function imprime(): void 
   { 
       echo...