Le pattern poids mouche ou Flyweight

Introduction
Le pattern poids mouche est utilisé pour optimiser le nombre d’objets présents dans la mémoire de votre application. Il peut-être utilisé dans des programmes utilisant un grand nombre d’objets et souhaitant en réduire le poids mémoire. Un logiciel utilisant trop de mémoire va souvent utiliser le fichier de pagination sur disque entrainant une baisse de performance importante (mécanisme de paging file).

Intention
Utiliser un système de partage d’attributs pour réduire l’occupation mémoire. Réduire la taille des gros objets présent en mémoire.

Motivation
Les classes crées au sein de votre application utilisent souvent de nombreux attributs : certaines de ces données ont des valeurs fréquemment constatées.

Exemple : on peut considérer que dans un thermomètre utilisé sur des humains les valeurs 37°, 38°, 39 ° et 40 ° sont souvent constatées.

Dans tous systèmes on peut ainsi rechercher des valeurs affectées aux attributs qui sont souvent constatées, et proposer de les transformer en constante, et ainsi obtenir des instances uniques.

Un exemple en Java : la classe « java.lang.String »
Java repère les références sur chaînes de caractères pointant des chaînes identiques. Java fait donc pointer ces références sur des objets chaînes identiques : il s’agit d’un exemple d’utilisation d’un parc à poids mouche.

Exemple illustré :

publicclass FlyWeigthString {
 public static void main(String[] args) {
 String s1 = "test";
 String s2 = "foo";

// Affichage
 System.out.println( s1.hashCode() );
 System.out.println( s2.hashCode() );

System.out.println("##################");

// On change ici la valeur de la chaîne
 s2 = "test";
 System.out.println( s1.hashCode() );
 System.out.println( s2.hashCode() );
 }
}

Résultat :

> 3556498
> 101574
> ##################
> 3556498
> 3556498

Que peux-t-on en dire ?
Dès lors que Java constate que les chaînes sont identiques, il ne crée qu’une seule chaîne, les 2 références pointant sur la même.

Structure du pattern

Voici la structure du pattern du GOF (bande des 4)

Pattern poids mouche structure

La factory
On remarque que le client demande un objet poids mouche à la fabrique. Cette dernière lui retourne l’instance d’un ConcreteFlyWeight existant où en crée une nouvelle. Cette dernière va gérer le parc d’objets, les créer et les distribuer.

Le client
Il utilise le parc d’objets ainsi obtenus par la fabrique, et en cas d’appel de la méthode Operation dans le poids mouche, il lui passe les états extrinsèques de l’objet.

La classe ConcreteFlyWeight
Elle stocke son état intrinsèque (les données partagées) et propose un comportement (ou des comportements récupérant en entrée l’état extrinsèque de l’objet). L’état intrinsèque est un état partagé entre de multiples objets.

Un cas d’exemple du pattern poids mouche

Pour expliquer quelque chose rien ne vaut un bon exemple :
En voici basé sur des lignes géométriques.

ClassicalLine
Une ligne est constituée des champs suivants :
_x et _y : les coordonnées
_length : la longueur de la ligne
_color : la couleur de la ligne (10 couleurs maximum)
_thickness : épaisseur de la ligne (1 épaisseur standard et quelques épaisseurs courantes)
_type : le type de la ligne, c’est-à-dire trait continu ou interrompu (2 types possibles)

Analyse
En étudiant les cas d’utilisations de notre système on se rend compte que :
–       Le nombre d’instances de lignes peut être très important
–       _x, _y et _length sont des champs qui peuvent être considéré comme des données très variantes (donc extrinsèque)
–       _color, _thickness et _type proposent quelques variantes mais peu en somme, donc la combinatoire n’est pas très élevée.

On remarque donc que 50% de la taille d’un objet (d’une instance) est « factorisable ».
50% de données extrinsèques, 50% de données intrinsèques.

Resolution
Voici une proposition pour créer un parc à poids mouche permettant la factorisation d’une partie de l’état d’une ligne.

ClassicalLine resolu

La classe « Program » représente le client qui utilise notre système. Cette classe stockera et notamment passera les états extrinsèques des « InternalLine »

La classe « LineFactory » est la fabrique qui gère notre parc à poids mouche, stocke les objets du type « ConcreteLine » qui représente la partie constante et partagée de notre combinatoire de lignes internes.

Conclusion
Si votre programme comporte de très nombreux objets comportant des types et valeurs d’attributs partageables, alors ce pattern peut-être adapté à votre problème. Tout dépend des cas d’utilisations, projetez les sur le papier avant de l’envisager et vérifiez sa pertinence.

J’espère que ce tutorial vous a plu, n’hésitez pas à le partager avec vos amis en utilisant les boutons ci-dessous.

Auteur : Bertrand L.

Au sujet du formateur

bertrand

Bertrand Leclercq

Expert iOS et Android, aide votre entreprise à développer sur mobile, anime vos formations développeurs, conseille vos équipes

Contacter le formateur
Catégories
One Comment
0 Pings & Trackbacks

Laisser un commentaire