JAVA/DesignPattern

Design Pattern 디자인 패턴 Flyweight Pattern 플라이웨이트 패턴

호두밥 2021. 12. 19. 20:47

FlyWeight Pattern 플라이웨이트 패턴

구조 패턴으로, 객체마다 모든 데이터를 저장하지 않고 공통된 부분은 공유할 수 있도록 해주는 패턴입니다. 

주로 객체 생성 횟수를 줄이고, 메모리 사용량을 줄이고 성능을 개선하기 위해 사용합니다.

flyweight 객체가 생성된 객체의 목록을 관리합니다.  비슷한 종류의 객체가 있다면 재사용하고, 없으면 새로 생성합니다. 예를 들어 객체 목록을 HashMap으로 가지고 있으면서, 동일한(비슷한) 객체가 있다면 그 객체를 재사용(get)하고 없으면 새로 생성 (put) 합니다. 

장단점

장점

  • RAM 메모리를 관리할 수 있습니다.

단점

  • flyweight의 메소드를 호출할때마다 데이터가 계산되어야 하는 경우, RAM의 작동량이 CPU 사이클을 넘어설 수도 있습니다. 

 

FlyWeight Pattern 플라이웨이트 패턴 구현

네모 객체들을 HashMap으로 관리합니다.

도형

public interface 도형 {
    String draw();
}

네모

public class 네모 implements 도형 {

    private String color;

    public 네모(String color) {
        this.color = color;
    }

    @Override
    public String draw() {
        return color+" 네모";
    }
}

Flyweight

public class Flyweight {

    private static final HashMap<String, 네모> 네모들 = new HashMap<>();

    public static 네모 get네모(String color){
        if(네모들.containsKey(color)){
            return 네모들.get(color);
        }

        네모 네모 = new 네모(color);
        네모들.put(color, 네모);
        return 네모;
    }

}

 

public class Main {

    public static void main(String[] args) {

        네모 빨강네모1 = Flyweight.get네모("빨강");
        System.out.println("빨강네모1 : "+빨강네모1.toString());
        네모 빨강네모2 = Flyweight.get네모("빨강");
        System.out.println("빨강네모2 : "+빨강네모2.toString());
        네모 파랑네모 = Flyweight.get네모("파랑");
        System.out.println("파랑네모 : "+파랑네모.toString());

    }

}
빨강네모1 : javatest.designPattern.flyweight.네모@7a0ac6e3
빨강네모2 : javatest.designPattern.flyweight.네모@7a0ac6e3
파랑네모 : javatest.designPattern.flyweight.네모@71be98f5

빨강네모1과 빨강네모2가 같은 HashCode를 같고 있음(동일한 객체)을 확인할 수 있습니다. 

참조