Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Design Patterns en Java
  3. Le pattern Flyweight
Extrait - Design Patterns en Java Descriptions et solutions illustrées en UML 2 et Java (5e édition) - Les 23 modèles de conception
Extraits du livre
Design Patterns en Java Descriptions et solutions illustrées en UML 2 et Java (5e édition) - Les 23 modèles de conception Revenir à la page d'achat du livre

Le pattern Flyweight

Description

Le but du pattern Flyweight est de partager de façon efficace un ensemble important d’objets de grain fin.

Exemple

Dans le système de vente de véhicules, il est nécessaire de gérer les options que l’acheteur peut choisir lorsqu’il commande un nouveau véhicule.

Ces options sont décrites par la classe OptionVéhicule qui contient plusieurs attributs comme le nom, l’explication, un logo, le prix standard, les incompatibilités avec d’autres options, avec certains modèles, etc.

Pour chaque véhicule commandé, il est possible d’associer une nouvelle instance de cette classe. Cependant un grand nombre d’options sont souvent présentes pour chaque véhicule commandé, ce qui oblige le système à gérer un grand ensemble d’objets de petite taille (de grain fin). Cette approche présente toutefois l’avantage de pouvoir stocker au niveau de l’option des informations spécifiques à celle-ci et au véhicule comme le prix de vente de l’option qui peut différer d’un véhicule commandé à un autre.

Cette solution est présentée sur un petit exemple à la figure 3-7.1 et il est aisé de se rendre compte qu’un grand nombre d’instances de OptionVéhicule doit être géré alors que nombre d’entre elles contiennent des données identiques.

images/fig419.PNG

Figure 3-7.1 - Exemple d’absence de partage d’objets...

Structure

1. Diagramme de classes

La figure 3-7.3 détaille la structure générique du pattern.

images/figure15-3.png

Figure 3-7.3 - Structure du pattern Flyweight

2. Participants

Les participants au pattern sont les suivants :

  • FabriqueFlyweight (FabriqueOption) crée et gère les flyweights. La fabrique s’assure que les flyweights sont partagés grâce à la méthode getFlyweight qui renvoie les références vers les flyweights.

  • Flyweight (OptionVéhicule) détient l’état intrinsèque et implante les méthodes. Ces méthodes reçoivent et déterminent également l’état extrinsèque des flyweights.

  • Client (VéhiculeCommandé) contient un ensemble de références vers les flyweights qu’il utilise. Le client doit également détenir l’état extrinsèque de ces flyweights.

3. Collaborations

Les clients ne doivent pas créer eux-mêmes les flyweights mais utiliser la méthode getFlyweight de la classe FabriqueFlyweight qui garantit que les flyweights sont partagés.

Lorsqu’un client invoque une méthode d’un flyweight, il doit lui transmettre son état extrinsèque.

Domaine d’application

Le domaine d’application du pattern Flyweight est le partage de petits objets (poids mouche). Les critères d’utilisation sont les suivants :

  • Le système utilise un grand nombre d’objets.

  • Le stockage des objets est coûteux à cause d’une grande quantité d’objets.

  • Il existe de nombreux ensembles d’objets qui peuvent être remplacés par quelques objets partagés une fois qu’une partie de leur état est rendue extrinsèque. 

Exemple en Java

La classe OptionVehicule possède un constructeur qui permet de définir l’état intrinsèque de l’option. Dans cet exemple, à part le nom, les autres attributs prennent des valeurs constantes ou basées directement sur le nom. Normalement, ces valeurs devraient provenir d’une base de données.

La méthode affiche prend le prix de vente comme paramètre qui constitue l’état extrinsèque.

public class OptionVehicule 
{ 
  protected String nom; 
  protected String description; 
  protected int prixStandard; 
 
  public OptionVehicule(String nom) 
  { 
    this.nom = nom; 
    this.description = "Description de " + nom; 
    this.prixStandard = 100; 
  } 
 
  public void affiche(int prixDeVente) 
  { 
    System.out.println("Option"); 
    System.out.println("Nom : " + nom); 
    System.out.println(description); 
    System.out.println("Prix standard : " + prixStandard); 
    System.out.println("Prix de vente : " + prixDeVente); 
  } 
} 

La classe...