public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
Gamma et al. 95
On doit instancier un grand nombre de petits objets
Trop gourmand au niveau de la mémoire
Du texte contenant un grand nombre de caractères
Un jeu massivement multi-joueurs (les objets graphiques)
L’ADN
Partager efficacement un grand nombre de petits objets
Fonctionnement :
Certaines données sont extraites du l’objet pour en minimiser le nombre d’instanciation
Seuls 4 bases azotées créées (G, A, T, C)
Leur position est stockée en dehors (dans l’ADN)
Sinon explosion du nombre d’instances de bases azotées
FabriquePoidsMouche: créer des objets que quand nécessaire (sinon retourne l’objet déjà existant)
L’utilisation du patron dans le code client passe par la fabrique pour obtenir des instances
PoidsMoucheConcret ne contient pas certaines données
Elles lui seront passées en paramètres (étatExtrinsèque)
PoidsMoucheConcretNonPartagé : cas spécial de poids-mouche qui n’externalise pas ses données
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
See: OpenJDK
Exemple : un texte se compose de caractères
Externalisation de la position/police des caractères
1 seul caractère pour 1 valeur (a, b, c, etc.)
public final class FabriqueCaractere {
public static FabriqueCaractere INSTANCE = new FabriqueCaractere();
private Map<Integer, Caractere> mapCaracteres;
private FabriqueCaractere() {
mapCaracteres = new IdentityHashMap<Integer, Caractere>();
}
public Caractere ObtenirCaractere(char valeur) {
Caractere car = mapCaracteres.get(valeur);
if(car==null) {
car = new Caractere(valeur);
mapCaracteres.put((int)valeur, car);
}
return car;
}
}
public class Texte {
protected List<Caractere> caracts;
public Texte() {
caracts = new ArrayList<Caractere>();
}
public void afficher(Graphics2D g) {
//...
}
public void ajouterCaractere(char valeur) {
caracts.add(FabriqueCaractere.INSTANCE.ObtenirCaractere(valeur));
}
}
public class Caractere {
protected char valeur;
//..
public Caractere(char valeur) {
this.valeur = valeur;
}
public void afficher(Graphics2D g, Point position) {
//...
}
}