Modelli di design - Modello di peso mosca

Il modello Flyweight viene utilizzato principalmente per ridurre il numero di oggetti creati e per ridurre l'ingombro della memoria e aumentare le prestazioni. Questo tipo di modello di progettazione rientra nel modello strutturale poiché questo modello fornisce modi per ridurre il conteggio degli oggetti migliorando così la struttura degli oggetti dell'applicazione.

Il modello Flyweight cerca di riutilizzare oggetti simili già esistenti memorizzandoli e crea un nuovo oggetto quando non viene trovato alcun oggetto corrispondente. Dimostreremo questo modello disegnando 20 cerchi di posizioni diverse ma creeremo solo 5 oggetti. Sono disponibili solo 5 colori, quindi la proprietà del colore viene utilizzata per controllare gli oggetti Circle già esistenti .

Implementazione

Creeremo un'interfaccia Shape e una classe concreta Circle che implementa l' interfaccia Shape . Una ShapeFactory di classe factory viene definita come passaggio successivo.

ShapeFactory ha una HashMap di Circle avente la chiave come colore dell'oggetto Circle . Ogni volta che arriva una richiesta per creare un cerchio di un colore particolare a ShapeFactory , controlla l'oggetto cerchio nella sua HashMap , se l'oggetto di Circle viene trovato, quell'oggetto viene restituito altrimenti viene creato un nuovo oggetto, memorizzato in hashmap per uso futuro e cliente.

FlyWeightPatternDemo , la nostra classe demo, utilizzerà ShapeFactory per ottenere un oggetto Shape . Passerà le informazioni ( rosso / verde / blu / nero / bianco ) a ShapeFactory per ottenere il cerchio del colore desiderato di cui ha bisogno.

Passo 1

Crea un'interfaccia.

Shape.java

public interface Shape {
   void draw();
}

Passo 2

Crea una classe concreta che implementa la stessa interfaccia.

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);
   }
}

Passaggio 3

Creare una fabbrica per generare oggetti di classe concreta sulla base di informazioni fornite.

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;
   }
}

Passaggio 4

Usa la fabbrica per ottenere l'oggetto della classe concreta passando un'informazione come il colore.

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);
   }
}

Passaggio 5

Verifica l'output.

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