12
sept
07

Design pattern de création “Prototype”

Après avoir vu le design pattern du singleton, voici un autre design pattern de création, le prototype. Ce design pattern permet de créer de nouveaux objets en partant d’objets existants. Cette création est en fait un processus de copie d’objet. On fait dès lors une copie, c’est-à-dire un clone, à partir d’un prototype.

Le prototype est l’objet modèle qui va servir de base pour la copie, et le clone est l’objet résultat de cette copie. On peut ainsi créer de nouveaux objets en clonant des objets qui ont été établis comme prototypes.

L’utilisation de ce pattern se fait dans deux principaux cas:

  • Rendre la classe utilisatrice de ces nouveaux objets indépendante de leurs créations;
  • Rendre la classe utilisatrice la plus souple possible afin d’alléger la hiérarchie de certains objets.

Le prototype est représenté via le schéma suivant :

Prototype

La classe AbstractPrototype représente la classe mère des prototypes. Les prototypes sont les modèles, les templates si vous préférez, et il peut donc y avoir plusieurs. Dans notre exemple, la classe AbstractPrototype est abstraite et implémente l’interface Cloneable. Cette interface est fourni dans les packages natifs de Java et elle oblige l’implémentation de la méthode clone(). L’implémentation de la méthode clone() dans notre exemple, fait un appel à la même méthode mais de la classe super. La classe super étant ici la classe java.lang.Object qui implémente par défaut la méthode clone().

Attention, si la classe utilisant la méthode clone() n’implémente pas l’interface Cloneable, alors l’exception CloneNotSupportedException est remontée. Autrement, si tout se passe bien de côté-là, cette méthode une nouvelle instance de la classe de l’objet et initialise tous ces champs avec les valeurs exactes trouvées dans cet objet. Mais le contenu plus profond des champs eux-mêmes ne sont pas clonés.

En plus de cette méthode, il y a un champ name qui a été rajouté avec ses méthodes “getter” et “setter” spécifiques afin qu’il puisse être démontré la bonne clonabilité de nos objets.

public abstract class AbstractPrototype implements Cloneable {

String name;

public Object clone() {
Object object = null;
try {
object = super.clone();
} catch(CloneNotSupportedException e) {
System.out.println(”Error during cloning of AbstractPrototype.”);
}
return object;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

La classe ConcretePrototype1 est un sous-type de la classe AbstractPrototype, elle la spécialise en venant établir le champ name avec une certaine valeur, ici “ConcretePrototype1″.

public class ConcretePrototype1 extends AbstractPrototype {

public ConcretePrototype1() {
setName(”ConcretePrototype1″);
}

}

La classe ConcretePrototype2 est, tout comme ConcretePrototype1, une spécialisation et vient établir le champ name avec “ConcretePrototype2″.

public class ConcretePrototype2 extends AbstractPrototype {

public ConcretePrototype2() {
setName(”ConcretePrototype2″);
}

}

En dernier lieu, la classe Client qui va vous permettre d’exploiter le design pattern du prototype. Elle implémente une méthode chargée d’appeler la méthode clone() de l’objet qu’on lui passe et de retourner la copie obtenue. Pour tester aisément, une méthode main() permettant de vérifier le bon fonctionnement de l’ensemble.

public class Client {

public Object operation(AbstractPrototype ap) {
Object o = ap.clone();
return o;
}

public static void main(String[] args) {
Client c = new Client();
AbstractPrototype copy = null;

ConcretePrototype1 ap1 = new ConcretePrototype1();
copy = (AbstractPrototype)c.operation(ap1);
System.out.println(”Name value of ConcreteType1=”+copy.getName());

ConcretePrototype2 ap2 = new ConcretePrototype2();
copy = (AbstractPrototype)c.operation(ap2);
System.out.println(”Name value of ConcreteType2=”+copy.getName());

}
}

Le design pattern du prototype permet d’avoir un code propre en cachant toute la hiérarchisation des classes et de faire ainsi des clones sans difficulté sans devoir passer par l’appel du constructeur consommatrice en terme temps et performance.

Liens externes


1 Réponse vers “Design pattern de création “Prototype””


  1. 1 Simon
    24 avril 2008 à 18:02

    Très bien expliqué avec le code, merci beaucoup !


Laisser un commentaire




BIENVENUE

Java Village fait son bout de chemin depuis maintenant environ un an, et l'équipe en profite au passage, au nom des différents contributeurs, de vous remercier de vos visites mais aussi de vos participations. A bientôt en espérant vous voir venir nous lire de plus en plus souvent!

BLOG STATS

  • 74,614 hits

STATISTIQUES

Vous êtes à présent environ 1500 visiteurs par mois à venir visiter Java Village, ce qui représente presque le double de visiteurs par rapport aux résultats affichés il y a un trimestre. Merci à tous.

Livre du moment…

SCJP

a

Partenaires