플라이웨이트 모드


플라이웨이트 패턴은 생성되는 객체 수를 줄여 메모리 사용량을 줄이고 성능을 향상시키는 데 주로 사용됩니다. 이러한 유형의 디자인 패턴은 객체 수를 줄여 애플리케이션에 필요한 객체 구조를 개선하는 방법을 제공하는 구조적 패턴입니다.

플라이웨이트 모드는 동일한 유형의 기존 개체를 재사용하려고 시도하며, 일치하는 개체가 없으면 새 개체를 만듭니다. 서로 다른 위치에 20개의 원을 그리는 5개의 개체를 만들어 이 패턴을 보여 드리겠습니다. 5가지 색상만 사용할 수 있으므로 색상 속성을 사용하여 기존 Circle 개체를 확인합니다.

소개

의도: 공유 기술을 사용하여 수많은 세분화된 개체를 효과적으로 지원합니다.

주요 해결 방법: 객체 수가 많은 경우 메모리 오버플로가 발생할 수 있습니다. 동일한 비즈니스 요청이 있는 경우 다시 생성되지 않도록 이미 메모리에 있는 객체를 직접 반환합니다.

사용 시기: 1. 시스템에 많은 수의 개체가 있습니다. 2. 이러한 개체는 많은 메모리를 소비합니다. 3. 이러한 개체의 상태는 대부분 외부화될 수 있습니다. 4. 이러한 객체는 내부 상태에 따라 여러 그룹으로 나눌 수 있습니다. 객체에서 외부 객체가 제거되면 각 객체 그룹이 객체로 대체될 수 있습니다. 5. 시스템은 이러한 객체의 신원에 의존하지 않으며 이러한 객체는 구별할 수 없습니다.

해결 방법: 고유 식별 코드를 사용하여 판단합니다. 메모리에 존재하는 경우 고유 식별 코드로 식별된 개체를 반환합니다.

키 코드: HashMap을 사용하여 이러한 개체를 저장하세요.

응용 예: 1. JAVA의 문자열이 있으면 반환하고, 없으면 문자열을 생성하여 문자열 캐시 풀에 저장합니다. 2. 데이터베이스의 데이터 풀.

장점: 객체 생성을 크게 줄이고 시스템 메모리를 줄이며 효율성을 향상시킵니다.

단점: 시스템의 책임이 향상되고 외부 상태와 내부 상태의 분리가 필요합니다. 또한 외부 상태는 고유한 특성을 가지며 내부 상태의 변화에 ​​따라 변경되어서는 안 됩니다. 그렇지 않으면 시스템에 혼란이 발생할 수 있습니다. 체계.

사용 시나리오: 1. 시스템에는 유사한 개체가 많이 있습니다. 2. 버퍼 풀이 필요한 시나리오.

참고: 1. 외부 상태와 내부 상태를 구분하는 데 주의하세요. 그렇지 않으면 스레드 안전 문제가 발생할 수 있습니다. 2. 이러한 클래스는 팩토리 객체에 의해 제어되어야 합니다.

Implementation

Shape 인터페이스와 Shape 인터페이스를 구현하는 엔터티 클래스 Circle을 생성하겠습니다. 다음 단계는 팩토리 클래스 ShapeFactory를 정의하는 것입니다.

ShapeFactory에는 CircleHashMap이 있으며 여기서 키는 Circle 개체의 색상입니다. 요청을 받을 때마다 특정 색상의 원이 생성됩니다. ShapeFactoryHashMap에서 원 개체를 확인하고 Circle 개체가 발견되면 개체를 반환하고, 그렇지 않으면 후속 사용을 위해 해시맵에 저장된 새 개체를 생성하고 해당 개체를 클라이언트에 반환합니다.

FlyWeightPatternDemo, 우리의 데모 클래스는 ShapeFactory를 사용하여 Shape 개체를 가져옵니다. 필요한 개체의 색상을 얻기 위해 정보(빨간색/녹색/파란색/검은색/흰색)를 ShapeFactory에 전달합니다.

flyweight_pattern_uml_diagram.jpg

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

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단계

출력을 확인합니다.

rreee