Le patron
Prototype
Cours DP– Mme Sameh HBAIEB
Le patron Prototype: Objectif
Prototype est un patron de conception qui crée de nouveaux objets à partir
d’objets existants sans rendre le code dépendant de leur classe.
Cours DP– Mme Sameh HBAIEB
Le patron Prototype: Problématique
Si nous voulons une copie exacte d’un objet, comment procède‐t‐on ?
Tout d’abord, il faut créer un nouvel objet de cette même classe. Ensuite, il
faut parcourir tous les attributs de l’objet d’origine et copier leurs valeurs dans
le nouvel objet.
Certains objets ne peuvent pas être copiés ainsi, car leurs attributs
peuvent être privés et ne pas être visibles en dehors de l’objet.
Etant donné qu’on doit connaître la classe de l’objet pour le
dupliquer, le code devient dépendant de cette classe.
Cours DP– Mme Sameh HBAIEB
Le patron Prototype: Solution
Le patron de conception prototype délègue le processus de clonage aux
objets qui vont être copiés.
Il déclare une interface commune pour tous les objets qui pourront être
clonés. Cette interface permet de cloner un objet sans coupler le code à la
classe de cet objet. En général, une telle interface ne contient qu’une seule
méthode clone.
L’implémentation de cette méthode se ressemble dans toutes les classes. Elle
crée un objet de la classe actuelle et reporte les valeurs des attributs de
l’objet d’origine dans le nouveau.
Un objet qui peut être cloné est appelé un prototype.
Cours DP– Mme Sameh HBAIEB
Le patron Prototype: Structure
Cours DP– Mme Sameh HBAIEB
Le patron Prototype: Exemple
Cours DP– Mme Sameh HBAIEB
Le patron Prototype: Avantages
Réduire le besoin de sous‐classement.
Cacher la complexité de la création des objets au client.
Accélèrer l'instanciation de grandes classes chargées dynamiquement.
Cours DP– Mme Sameh HBAIEB
Le patron Prototype: Implémentation
Nous allons créer une classe abstraite Vehicule implémentant une interface
clonable et des classes concrètes étendant la classe Vehicule.
Une classe VehiculeCache est définie comme une étape suivante qui stocke les
objets du véhicule dans une table de hachage et renvoie leur clone sur
demande.
PrototypeExample est notre classe de démonstration qui utilise la classe
VehiculeCache pour obtenir un objet Vehicule.
Cours DP– Mme Sameh HBAIEB
Le patron Prototype: Implémentation
Cours DP– Mme Sameh HBAIEB
Le patron Prototype: Implémentation
Step 1 Create abstract class implementing Cloneable interface
Vehicle.java
public abstract class Vehicle implements Cloneable {
protected String type;
private String licenseNo;
@Override
public abstract void printVehicle(); protected Object clone() {
Object clone = null;
public String getType() { try {
return type; clone = super.clone();
} } catch (CloneNotSupportedException e) {
public String getLicenseNo() { e.printStackTrace();
return licenseNo; }
} return clone;
public void setLicenseNo(String licenseNo) { }
this.licenseNo = licenseNo; }
}
Cours DP– Mme Sameh HBAIEB
Le patron Prototype: Implémentation
Step 2 Create concrete class extending Vehicle abstract class
ThreeWheeler.java
TwoWheeler.java public class ThreeWheeler extends Vehicle {
public class TwoWheeler extends Vehicle { public ThreeWheeler() {
public TwoWheeler() { type = "Three Wheeler";
type = "Two Wheeler"; }
}
@Override
@Override public void printVehicle() {
public void printVehicle() { System.out.println("I am three wheeler.");
System.out.println("I am two wheeler."); }}
}
} FourWheeler.java
public class FourWheeler extends Vehicle {
public FourWheeler() {
type = "Four Wheeler";
}
@Override
public void printVehicle() {
System.out.println("I am four wheeler.");
Cours DP– Mme Sameh HBAIEB }}
Le patron Prototype: Implémentation
Step 3
Create class that will fetch classes objects from database and store it in Hash Table
VehicleCache.java
import java.util.Hashtable;
public class VehicleCache { static public void loadCache() {
private static Hashtable vehicleMap = new Hashtable(); TwoWheeler twoWheeler = new TwoWheeler();
twoWheeler.setLicenseNo("KA001");
public static Vehicle getVehicle(String licenseNo) { vehicleMap.put(twoWheeler.getLicenseNo(), twoWheeler);
Vehicle cachedVehicle = vehicleMap.get(licenseNo);
return (Vehicle) cachedVehicle.clone(); ThreeWheeler threeWheeler = new ThreeWheeler();
} threeWheeler.setLicenseNo("MH001");
vehicleMap.put(threeWheeler.getLicenseNo(), threeWheeler);
FourWheeler fourWheeler = new FourWheeler();
fourWheeler.setLicenseNo("BH001");
vehicleMap.put(fourWheeler.getLicenseNo(), fourWheeler);
}
}
Cours DP– Mme Sameh HBAIEB
Le patron Prototype: Implémentation
Step 4
PrototypeExample class is used to clone the object that is stored in hash table
PrototypeExample.java
public class PrototypeExample {
public static void main(String[] args) {
VehicleCache.loadCache();
Vehicle clonedVehicle = VehicleCache.getVehicle("MH001");
clonedVehicle.printVehicle(); // I am three wheeler.
clonedVehicle = VehicleCache.getVehicle("BH001");
clonedVehicle.printVehicle(); // I am four wheeler.
clonedVehicle = VehicleCache.getVehicle("KA001");
clonedVehicle.printVehicle(); // I am two wheeler.
}
}
Cours DP– Mme Sameh HBAIEB
Exercice d’application
Créer une application qui permet de gérer un ensemble de Shape par clonage
Cours DP– Mme Sameh HBAIEB