« Patrons de conception/Prototype » : différence entre les versions
Contenu supprimé Contenu ajouté
m 32 versions depuis w:Prototype (patron de conception) : pour Patrons de conception/Prototype |
+ liens + image + traduction en->fr |
||
Ligne 1 :
{{Patrons de conception}}
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.▼
▲Le [[../|patron de conception]] '''prototype''' est utilisé lorsque la création d'une
Pour implanter ce patron il faut déclarer une classe abstraite spécifiant une méthode abstraite (virtuelle pure en C++) appelée ''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 (patron de conception)|fabrique]] avec un paramètre désignant la classe concrète à instancier).▼
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
== Structure ==
Le
[[Image:UML DP Prototype.png|center|Diagramme UML des classes du patron de conception prototype]]
La classe ''Prototype'' sert de modèle principal pour la création de nouvelles copies.
Les classes '' 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 == Exemple de code en C# ==
<source lang="csharp">
Car,
Person
public abstract Record Clone();
string name;
int age;
public override Record Clone()
{
return (Record)this.MemberwiseClone(); // default shallow copy
}
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;
}
private static Dictionary<RecordType, Record> _prototypes = new Dictionary<RecordType, Record>();
/// <summary>
/// Constructor
Ligne 73 ⟶ 79 :
public RecordFactory()
{
_prototypes.Add(RecordType.Car, new CarRecord());
_prototypes.Add(RecordType.Person, new PersonRecord());
}
/// <summary>
/// The Factory method
Ligne 82 ⟶ 88 :
public Record CreateRecord(RecordType type)
{
return _prototypes[type].Clone();
}
</source>
Ligne 90 ⟶ 96 :
<source lang="java">
▲ public class Cookie implements Cloneable
▲ {
public Object clone()
{
try
{
//
//
// valeurs valides (exemple : un nouvel identificateur unique pour la copie).
return this.getClass().newInstance();
}
catch(InstantiationException e)
{
e.printStackTrace();
return null;
}
}
▲ public class CoconutCookie extends Cookie { }
/* Classe utilisatrice */
private Cookie cookie; // peut aussi être déclaré comme : private Cloneable cookie;
▲ public class CookieMachine
▲ {
public
public Cookie makeCookie()
}▼
{
public Object clone() { }
{
▲ {
CookieMachine
▲ Cookie prot = new CoconutCookie();
tempCookie = cm.makeCookie();
▲ for (int i=0; i<100; i++)
▲ tempCookie = cm.makeCookie();
▲ }
▲ }
</source>
== Exemples ==
Exemple où '''prototype''' s'applique : supposons une classe pour interroger une
À 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 ===
Ligne 153 ⟶ 161 :
* {{fr}} [http://jvillage.wordpress.com/2007/09/12/design-pattern-de-creation-%e2%80%9cprototype%e2%80%9d/ Explication du Prototype en Java avec exemple concret] par Java Village
▲[[Catégorie:Patron de conception]]
|