디자인 패턴-플라이 웨이트 패턴

플라이 웨이트 패턴은 주로 생성되는 객체 수를 줄이고 메모리 공간을 줄이고 성능을 높이는 데 사용됩니다. 이러한 유형의 디자인 패턴은 구조적 패턴에 속합니다.이 패턴은 오브젝트 수를 줄이는 방법을 제공하여 애플리케이션의 오브젝트 구조를 개선합니다.

플라이 웨이트 패턴은 이미 존재하는 유사한 종류의 개체를 저장하여 재사용을 시도하고 일치하는 개체가 없으면 새 개체를 만듭니다. 서로 다른 위치에 20 개의 원을 그려이 패턴을 시연 할 것이지만 5 개의 개체 만 만들 것입니다. 5 가지 색상 만 사용할 수 있으므로 기존 Circle 객체 를 확인하기 위해 color 속성을 사용 합니다.

이행

우리는 생성하려고하는 모양 인터페이스를 콘크리트 클래스 서클 구현하는 모양 인터페이스를. 팩토리 클래스 ShapeFactory 는 다음 단계로 정의됩니다.

ShapeFactory 에는 Circle 객체의 색상으로 키를 갖는 CircleHashMap 이 있습니다. 요청에 특정 색상의 원 만들기 위해 오는 때마다 ShapeFactory를 , 그것의 원형 개체 확인 의 HashMap을 의 객체 경우, 서클 발견 객체, 그렇지 않으면 새로운 개체가 만들어 반환 향후 사용을 위해 해시 맵에 저장에 반환됩니다, 고객.

FlyWeightPatternDemo , 데모 클래스는 사용 ShapeFactory을 받으려는 모양 객체를. 정보 ( 빨강 / 녹색 / 파랑 / 검정 / 흰색 )를 ShapeFactory 에 전달하여 원하는 색상의 원을 얻습니다.

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

출력을 확인하십시오.

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