Mode poids mouche


Flyweight Pattern est principalement utilisé pour réduire le nombre d'objets créés afin de réduire l'utilisation de la mémoire et d'améliorer les performances. Ce type de modèle de conception est un modèle structurel qui permet de réduire le nombre d'objets et ainsi d'améliorer la structure des objets requise par l'application.

Le mode Flyweight tente de réutiliser des objets existants du même type ou de créer de nouveaux objets si aucun objet correspondant n'est trouvé. Nous allons démontrer ce modèle en créant 5 objets qui dessinent 20 cercles à différents endroits. Puisqu'il n'y a que 5 couleurs disponibles, la propriété color est utilisée pour vérifier un objet Circle existant.

Introduction

Intention : Utiliser la technologie de partage pour prendre en charge efficacement un grand nombre d'objets à granularité fine.

Solution principale : Lorsqu'il y a un grand nombre d'objets, cela peut provoquer un débordement de mémoire. S'il y a la même demande métier, renvoyons directement les données déjà stockées. dans la mémoire. Certains objets ne peuvent pas être recréés.

Quand utiliser : 1. Il y a un grand nombre d'objets dans le système. 2. Ces objets consomment beaucoup de mémoire. 3. La plupart du statut de ces objets peut être externalisé. 4. Ces objets peuvent être divisés en plusieurs groupes selon leurs états intrinsèques. Lorsque les objets extrinsèques sont supprimés des objets, chaque groupe d'objets peut être remplacé par un objet. 5. Le système ne repose pas sur l'identité de ces objets, et ces objets sont indiscernables.

Comment résoudre : Utilisez le code d'identification unique pour juger s'il existe dans la mémoire, renvoyez l'objet identifié par le code d'identification unique.

Code clé : Utilisez HashMap pour stocker ces objets.

Exemples d'application : 1. Chaîne en JAVA, si elle existe, renvoyez-la, sinon, créez une chaîne et enregistrez-la dans le pool de cache de chaînes. 2. Le pool de données de la base de données.

Avantages : Réduit considérablement la création d'objets, réduit la mémoire système et améliore l'efficacité.

Inconvénients : Cela améliore la responsabilité du système et nécessite de séparer l'état externe et l'état interne. De plus, l'état externe a une nature inhérente et ne devrait pas changer avec le changement de. l’état interne. Sinon, cela provoquerait le chaos du système.

Scénarios d'utilisation : 1. Le système possède un grand nombre d'objets similaires. 2. Scénarios nécessitant un pool de mémoire tampon.

Remarques : 1. Faites attention à la division de l'état externe et de l'état interne, sinon des problèmes de sécurité des threads peuvent survenir. 2. Ces classes doivent être contrôlées par un objet d'usine.

Implémentation

Nous allons créer une interface Shape et une classe d'entité Circle qui implémente l'interface Shape. L'étape suivante consiste à définir la classe d'usine ShapeFactory.

ShapeFactory a un HashMap de Circle où la clé est la couleur de l'objet Circle. Chaque fois qu'une demande est reçue, un cercle d'une couleur spécifique est créé. ShapeFactory vérifie son HashMap pour les objets cercle et si un objet Circle est trouvé, il est renvoyé, sinon il est créé et stocké dans un hashmap pour une utilisation ultérieure nouveau objet et renvoie l'objet au client.

FlyWeightPatternDemo, notre classe de démonstration utilise ShapeFactory pour obtenir l'objet Shape. Il transmettra des informations (rouge/vert/bleu/noir/blanc) à la ShapeFactory afin d'obtenir la couleur de l'objet dont il a besoin.

flyweight_pattern_uml_diagram.jpg

Étape 1

Créer une interface.

Shape.java

public interface Shape {
   void draw();
}

Étape 2

Créez une classe d'entité qui implémente l'interface.

Circle.java

public class Circle implements Shape {
   private String color;
   private int x;
   private int y;
   private int radius;

   public Circle(String color){
      this.color = color;		
   }

   public void setX(int x) {
      this.x = x;
   }

   public void setY(int y) {
      this.y = y;
   }

   public void setRadius(int radius) {
      this.radius = radius;
   }

   @Override
   public void draw() {
      System.out.println("Circle: Draw() [Color : " + color 
         +", x : " + x +", y :" + y +", radius :" + radius);
   }
}

Étape 3

Créez une usine pour générer des objets de classes d'entités en fonction des informations fournies.

ShapeFactory.java

import java.util.HashMap;

public class ShapeFactory {
   private static final HashMap<String, Shape> circleMap = new HashMap();

   public static Shape getCircle(String color) {
      Circle circle = (Circle)circleMap.get(color);

      if(circle == null) {
         circle = new Circle(color);
         circleMap.put(color, circle);
         System.out.println("Creating circle of color : " + color);
      }
      return circle;
   }
}

Étape 4

Utilisez cette usine pour obtenir l'objet de la classe d'entité en transmettant les informations de couleur.

FlyweightPatternDemo.java

public class FlyweightPatternDemo {
   private static final String colors[] = 
      { "Red", "Green", "Blue", "White", "Black" };
   public static void main(String[] args) {

      for(int i=0; i < 20; ++i) {
         Circle circle = 
            (Circle)ShapeFactory.getCircle(getRandomColor());
         circle.setX(getRandomX());
         circle.setY(getRandomY());
         circle.setRadius(100);
         circle.draw();
      }
   }
   private static String getRandomColor() {
      return colors[(int)(Math.random()*colors.length)];
   }
   private static int getRandomX() {
      return (int)(Math.random()*100 );
   }
   private static int getRandomY() {
      return (int)(Math.random()*100);
   }
}

Étape 5

Vérifiez le résultat.

Creating circle of color : Black
Circle: Draw() [Color : Black, x : 36, y :71, radius :100
Creating circle of color : Green
Circle: Draw() [Color : Green, x : 27, y :27, radius :100
Creating circle of color : White
Circle: Draw() [Color : White, x : 64, y :10, radius :100
Creating circle of color : Red
Circle: Draw() [Color : Red, x : 15, y :44, radius :100
Circle: Draw() [Color : Green, x : 19, y :10, radius :100
Circle: Draw() [Color : Green, x : 94, y :32, radius :100
Circle: Draw() [Color : White, x : 69, y :98, radius :100
Creating circle of color : Blue
Circle: Draw() [Color : Blue, x : 13, y :4, radius :100
Circle: Draw() [Color : Green, x : 21, y :21, radius :100
Circle: Draw() [Color : Blue, x : 55, y :86, radius :100
Circle: Draw() [Color : White, x : 90, y :70, radius :100
Circle: Draw() [Color : Green, x : 78, y :3, radius :100
Circle: Draw() [Color : Green, x : 64, y :89, radius :100
Circle: Draw() [Color : Blue, x : 3, y :91, radius :100
Circle: Draw() [Color : Blue, x : 62, y :82, radius :100
Circle: Draw() [Color : Green, x : 97, y :61, radius :100
Circle: Draw() [Color : Green, x : 86, y :12, radius :100
Circle: Draw() [Color : Green, x : 38, y :93, radius :100
Circle: Draw() [Color : Red, x : 76, y :82, radius :100
Circle: Draw() [Color : Blue, x : 95, y :82, radius :100