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

Description

Le but du pattern est la création de nouveaux objets par duplication d’objets existants appelés prototypes qui disposent de la capacité de clonage.

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 des changements de réglementation. Nous introduisons une classe Liasse dont les instances sont des liasses composées des différents documents nécessaires. Pour chaque type de document, nous introduisons une classe correspondante.

Puis nous créons un modèle de liasse qui est une instance particulière de la classe Liasse et qui contient les différents documents nécessaires, documents qui restent vierges. Nous appelons cette liasse, la liasse vierge. 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’impose 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.

Cette technique basée sur des objets disposant de la capacité de clonage utilise...

Structure

1. Diagramme de classes

La figure 2-5.2 détaille la structure générique du pattern.

images/figure7-2.png

Figure 2-5.2 - Structure du pattern Prototype

2. Participants

Les participants au pattern sont les suivants :

  • Client (Liasse, 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 sa hiérarchie de sous-classes.

  • Prototype (Document) est une classe abstraite d’objets capables de se dupliquer eux-mêmes. Elle introduit 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 en implante la méthode duplique.

3. Collaboration

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

Domaines d’utilisation

Le 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 Java

Le code source de la classe abstraite Document et de ses sous-classes concrètes est donné à la suite. Pour simplifier, à la différence du diagramme de classes, les méthodes duplique et remplit sont concrètes dans la classe Document. La méthode duplique utilise la méthode clone fournie par Java.

La méthode clone de Java nous évite de devoir recopier manuellement chaque attribut. Par conséquent, la méthode duplique peut être totalement implantée au niveau de la classe abstraite Document.

public abstract class Document implements Cloneable 
{ 
  protected String contenu = new String(); 
 
  public Document duplique() 
  { 
    Document resultat; 
    try 
    { 
      resultat = (Document)this.clone(); 
    } 
    catch (CloneNotSupportedException exception) 
    { 
      return null; 
    } 
    return resultat; 
  } 
 
  public void remplit(String informations) 
  { 
    contenu = informations; 
  } 
 
  public abstract void imprime(); 
  public abstract void affiche(); 
} 
 
public class BonDeCommande extends Document 
{ 
  public...