Учебники

Шаблоны дизайна — шаблон Flyweight

Шаблон Flyweight в основном используется для уменьшения количества создаваемых объектов, а также для уменьшения объема используемой памяти и повышения производительности. Этот тип шаблона проектирования подпадает под структурный шаблон, так как этот шаблон предоставляет способы уменьшить количество объектов, улучшая структуру объекта приложения.

Шаблон Flyweight пытается повторно использовать уже существующие объекты аналогичного типа, сохраняя их, и создает новый объект, когда соответствующий объект не найден. Мы продемонстрируем эту модель, нарисовав 20 кругов в разных местах, но мы создадим только 5 объектов. Доступно только 5 цветов, поэтому свойство color используется для проверки уже существующих объектов Circle .

Реализация

Мы собираемся создать интерфейс Shape и конкретный класс Circle, реализующий интерфейс Shape . Фабричный класс ShapeFactory определяется как следующий шаг.

ShapeFactory имеет HashMap of Circle, имеющий ключ в качестве цвета объекта Circle . Всякий раз, когда приходит запрос на создание круга определенного цвета в ShapeFactory , он проверяет объект круга в своем HashMap , если объект Circle найден, этот объект возвращается, в противном случае создается новый объект, сохраняется в hashmap для будущего использования и возвращается в клиент.

FlyWeightPatternDemo , наш демонстрационный класс, будет использовать ShapeFactory для получения объекта Shape . Он будет передавать информацию ( красный / зеленый / синий / черный / белый ) в ShapeFactory, чтобы получить круг нужного ему цвета.

Диаграмма UML

Шаг 1

Создать интерфейс.

Shape.java

public interface Shape {
   void draw();
}

Шаг 2

Создайте конкретный класс, реализующий тот же интерфейс.

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

Шаг 3

Создать фабрику для генерации объекта конкретного класса на основе заданной информации.

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

Шаг 4

Используйте фабрику, чтобы получить объект конкретного класса, передавая информацию, такую ​​как цвет.

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

Шаг 5

Проверьте вывод.