« Patrons de conception/Prototype » : différence entre les versions

Contenu supprimé Contenu ajouté
imported>Ymarcon
Aucun résumé des modifications
imported>Ymarcon
Aucun résumé des modifications
Ligne 2 :
Le [[motif 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 appopriée.
 
Pour implanter ce motif, il faut déclarer une classe abstraite spécifiant une méthode virtuelle pure appelée ''clone()''. Toutes classes nécessitant un [[constructeur (programmation informatique)|constructeur]] [[polymorphisme (informatique)|polymorphique]] dérivera de cette classe abstariteabstraite et implentera 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, appelera la méthode ''clone()'' sur le prototype ou appelerapassera unepar méthodeun demécanisme fabriquefourni avecpar un paramètreautre désignantmotif lade classeconception concrète(par àexemple instancierune ouméthode encorede appelera[[fabrique la(Motif méthodede ''clone(conception)''|fabrique]] paravec un mécanismeparamètre fournidésignant parla unclasse autreconcrète motifà de conceptioninstancier).
 
 
Exemple où '''prototype''' s'applique: supposons une classe pour interroger une [[base de données]]. A 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.
 
== Structure ==
Le [[diagramme de classes]] est le suivant:
 
[[Image:Prototype classdia.png]]
 
== C# sample code ==
 
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();
}
}
 
== Exemples ==
 
Exemple où '''prototype''' s'applique: supposons une classe pour interroger une [[base de données]]. A 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 connection à 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.
 
[[Catégorie:Motif de conception]]