Prototype (motif de conception)

Prototype (motif de conception)

Prototype (patron de conception)

Page d'aide sur l'homonymie Pour les articles homonymes, voir Prototype.

Le patron de conception prototype est utilisé lorsque la création d'une instance est complexe ou consommatrice en temps. Plutôt que créer plusieurs instances de la classe, on copie la première instance et on modifie la copie de façon appropriée.

Pour implanter ce patron il faut déclarer une classe abstraite spécifiant une méthode virtuelle pure appelée clone(). Toute classe nécessitant un constructeur polymorphique dérivera de cette classe abstraite et implantera la méthode clone().

Le client de cette classe, au lieu d'écrire du code invoquant directement l'opérateur "new" sur une classe explicitement connue, appellera la méthode clone() sur le prototype ou passera par un mécanisme fourni par un autre patron de conception (par exemple une méthode de fabrique avec un paramètre désignant la classe concrète à instancier).

Sommaire

Structure

Le diagramme de classes est le suivant :

Prototype classdia.png

La classe Prototype sert de modèle principal pour la création de nouvelles copies. Les classes ConcretePrototype1 et ConcretePrototype2 viennent spécialiser la classe Prototype en venant par exemple modifier certains attributs. La méthode clone() doit retourner une copie de l'objet concerné. Les sous-classes peuvent hériter ou surcharger la méthode clone(). La classe Client va se charger d'appeler les méthodes de clonage via sa méthode operation().

Exemple de code en C#

 public enum RecordType
 {
    Car,
    Person
 }
 
 /// <summary>
 /// Record is the Prototype
 /// </summary>
 public abstract class Record
 {
    public abstract Record Clone();
 }
 
 /// <summary>
 /// PersonRecord is the Concrete Prototype
 /// </summary>
 public class PersonRecord : Record
 {
    string name;
    int age;
 
    public override Record Clone()
    {
       return (Record)this.MemberwiseClone(); // default shallow copy
    }
 }
 
 /// <summary>
 /// CarRecord is another Concrete Prototype
 /// </summary>
 public class CarRecord : Record
 {
    string carname;
    Guid id;
 
    public override Record Clone()
    {
       CarRecord clone = (CarRecord)this.MemberwiseClone(); // default shallow copy
       clone.id = Guid.NewGuid(); // always generate new id
       return clone;
    }
 }
 
 /// <summary>
 /// RecordFactory is the client
 /// </summary>
 public class RecordFactory
 {
    private static Dictionary<RecordType, Record> _prototypes = new Dictionary<RecordType, Record>();
 
    /// <summary>
    /// Constructor
    /// </summary>
    public RecordFactory()
    {
       _prototypes.Add(RecordType.Car, new CarRecord());
       _prototypes.Add(RecordType.Person, new PersonRecord());
    }
 
    /// <summary>
    /// The Factory method
    /// </summary>
    public Record CreateRecord(RecordType type)
    {
       return _prototypes[type].Clone();
    }
 }

Exemple de code en JAVA

 /* Prototype Class */
 
 public class Cookie implements Cloneable
 {
    public Object clone()
    {
        try
        {
            // In an actual implementation of this pattern you would now attach references to
            // the expensive to produce parts from the copies that are held inside the prototype.
 
            return this.getClass().newInstance();
        }
        catch(InstantiationException e)
        {
           e.printStackTrace();
           return null;
        }
    }
 }
 
 /* Concrete Prototypes to clone */
 
 public class CoconutCookie extends Cookie { }
 
 /* Client Class */
 
 public class CookieMachine
 {
     private Cookie cookie; // could have been a private Cloneable cookie;
 
     public CookieMachine(Cookie cookie)
     { 
         this.cookie = cookie; 
     }
 
     public Cookie makeCookie()
     {
         return (Cookie) cookie.clone(); 
     }
 
     public Object clone() { } 
 
     public static void main(String args[])
     { 
         Cookie        tempCookie =  null; 
         Cookie        prot       = new CoconutCookie(); 
         CookieMachine cm         = new CookieMachine(prot); 
 
         for (int i=0; i<100; i++)
             tempCookie = cm.makeCookie(); 
     }
 }

Exemples

Exemple où prototype s'applique : supposons une classe pour interroger une base de données. À l'instanciation de cette classe on se connecte et on récupère les données de la base avant d'effectuer tous types de manipulation. Par la suite il sera plus performant pour les futures instances de cette classe de continuer à manipuler ces données que de réinterroger la base. Le premier objet de connexion à la base de données aura été créé directement puis initialisé. Les objets suivants seront une copie de celui-ci et donc ne nécessiteront pas de phase d'initialisation.

Liens externes

Divers

  • Portail de l’informatique Portail de l’informatique
Ce document provient de « Prototype (patron de conception) ».

Wikimedia Foundation. 2010.

Contenu soumis à la licence CC-BY-SA. Source : Article Prototype (motif de conception) de Wikipédia en français (auteurs)

Игры ⚽ Поможем решить контрольную работу

Regardez d'autres dictionnaires:

  • Prototype (Motif de conception) — Prototype (patron de conception) Pour les articles homonymes, voir Prototype. Le patron de conception prototype est utilisé lorsque la création d une instance est complexe ou consommatrice en temps. Plutôt que créer plusieurs instances de la… …   Wikipédia en Français

  • Motif de conception — Patron de conception Pour les articles homonymes, voir Patron. Un patron de conception (design pattern en anglais) est un concept de génie logiciel destiné à résoudre les problèmes récurrents suivant le paradigme objet. En français on utilise… …   Wikipédia en Français

  • Singleton (Motif de conception) — Singleton (patron de conception) En génie logiciel, le singleton est un patron de conception (design pattern) dont l objet est de restreindre l instanciation d une classe à un seul objet (ou bien à quelques objets seulement). Il est utilisé… …   Wikipédia en Français

  • Singleton (motif de conception) — Singleton (patron de conception) En génie logiciel, le singleton est un patron de conception (design pattern) dont l objet est de restreindre l instanciation d une classe à un seul objet (ou bien à quelques objets seulement). Il est utilisé… …   Wikipédia en Français

  • Modèle de conception — Patron de conception Pour les articles homonymes, voir Patron. Un patron de conception (design pattern en anglais) est un concept de génie logiciel destiné à résoudre les problèmes récurrents suivant le paradigme objet. En français on utilise… …   Wikipédia en Français

  • Modèles de conception — Patron de conception Pour les articles homonymes, voir Patron. Un patron de conception (design pattern en anglais) est un concept de génie logiciel destiné à résoudre les problèmes récurrents suivant le paradigme objet. En français on utilise… …   Wikipédia en Français

  • Motifs de conception — Patron de conception Pour les articles homonymes, voir Patron. Un patron de conception (design pattern en anglais) est un concept de génie logiciel destiné à résoudre les problèmes récurrents suivant le paradigme objet. En français on utilise… …   Wikipédia en Français

  • Patrons de conception — Patron de conception Pour les articles homonymes, voir Patron. Un patron de conception (design pattern en anglais) est un concept de génie logiciel destiné à résoudre les problèmes récurrents suivant le paradigme objet. En français on utilise… …   Wikipédia en Français

  • Schéma de conception — Patron de conception Pour les articles homonymes, voir Patron. Un patron de conception (design pattern en anglais) est un concept de génie logiciel destiné à résoudre les problèmes récurrents suivant le paradigme objet. En français on utilise… …   Wikipédia en Français

  • Design Pattern — Patron de conception Pour les articles homonymes, voir Patron. Un patron de conception (design pattern en anglais) est un concept de génie logiciel destiné à résoudre les problèmes récurrents suivant le paradigme objet. En français on utilise… …   Wikipédia en Français

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”