Modèles de conception - Modèle de poids mouche

Le modèle Flyweight est principalement utilisé pour réduire le nombre d'objets créés et pour réduire l'empreinte mémoire et augmenter les performances. Ce type de modèle de conception relève d'un modèle structurel car ce modèle fournit des moyens de réduire le nombre d'objets, améliorant ainsi la structure d'objet de l'application.

Le modèle Flyweight tente de réutiliser des objets de type similaire déjà existants en les stockant et crée un nouvel objet lorsqu'aucun objet correspondant n'est trouvé. Nous allons démontrer ce modèle en dessinant 20 cercles d'emplacements différents mais nous ne créerons que 5 objets. Seules 5 couleurs sont disponibles, donc la propriété de couleur est utilisée pour vérifier les objets Circle déjà existants .

la mise en oeuvre

Nous allons créer une interface Shape et une classe concrète Circle implémentant l' interface Shape . Une classe d'usine ShapeFactory est définie comme étape suivante.

ShapeFactory a un HashMap de Circle ayant la clé comme couleur de l' objet Circle . Chaque fois qu'une demande vient de créer un cercle d'une couleur particulière à ShapeFactory , elle vérifie l'objet cercle dans son HashMap , si l'objet de Circle est trouvé, cet objet est retourné sinon un nouvel objet est créé, stocké dans hashmap pour une utilisation future, et renvoyé client.

FlyWeightPatternDemo , notre classe de démonstration, utilisera ShapeFactory pour obtenir un objet Shape . Il transmettra des informations ( rouge / vert / bleu / noir / blanc ) à ShapeFactory pour obtenir le cercle de la couleur souhaitée dont il a besoin.

Étape 1

Créez une interface.

Shape.java

public interface Shape {
   void draw();
}

Étape 2

Créez une classe concrète implémentant la même 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 fabrique pour générer un objet de classe concrète basé sur des informations données.

ShapeFactory.java

import java.util.HashMap;

public class ShapeFactory {

   // Uncomment the compiler directive line and
   // javac *.java will compile properly.
   // @SuppressWarnings("unchecked")
   private static final HashMap 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 la fabrique pour obtenir un objet de classe concrète en transmettant une information telle que la 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 la sortie.

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