본문 바로가기
Study with group/Key Words

플라이 웨이트 패턴 (Flyweight Pattern)

by JunHeeLim 2023. 1. 7.

요청마다 매번 새로운 인스턴스를 생성하는 것이 아닌 ​ 동일한 속성을 가진 인스턴스를 가능한 한 공유해서 사용함으로써 메모리를 절약하는 패턴이다.

 

예를 들어 무지개 색의 색연필이 있고 100명의 사용자가 각각 7원색을 모두 요청 하였다고 가정했을 때, 요청마다 새로운 인스턴스를 생성하게 되면 700개의 인스턴스가 생성되어야 한다.

 

그러나 플라이 웨이트 패턴을 이용하여 요청된 속성의 객체를 캐싱하여 동일한 속성을 요청하였을 경우 캐싱해둔 인스턴스를 반환함으로서 7개의 인스턴스로 처리 가능하다. 

 

 

플라이 웨이트 패턴 구성

  1. 공유될 객체
  2. 객체의 인스턴스를 생성하고 캐싱하여 공유해주는 팩토리

예제 코드

색연필 클래스

/**
 *  길이와 무게 등은 고정값이라고 가정하고 진행한다.
 *  색만 변경한다.
 */
public class ColorPencil {
    private String color;
    private final int width = 15; // 15cm
    private final int weight = 10; // 10g

    public ColorPencil(String color) {
        this.color = color;
    }

    public void info() {
        System.out.println(color + "의 연필이 꺼내졌습니다.");
    }
}

색연필 팩토리

public class ColorPencilFactory {

    // 맵 자료구조로 색연필 정보 저장
    public static Map<String, ColorPencil> colorPencilCash = new HashMap<>();

    public static ColorPencil getColorPencil(String color) {
        ColorPencil colorPencil = colorPencilCash.get(color);
        if(colorPencil == null) {
            colorPencil = new ColorPencil(color);
            colorPencilCash.put(color, colorPencil);
            System.out.println(color + "의 색연필 신규 생성");
        }
        return colorPencil;
    }
}

실행 결과

public class Main {
    public static void main(String[] args) {

        String[] colorList = {"빨간색", "주황색", "노란색", "초록색", "파랑색", "남색", "보라색"};
        
        // 신규 생성
        System.out.println("============== 신규 생성 ==============");
        for(String color : colorList) {
            ColorPencil colorPencil = ColorPencilFactory.getColorPencil(color);
            colorPencil.info();
        }

        // 저장 정보 확인하여 그대로 반환
        System.out.println("============== 반환 ==============");
        for(String color : colorList) {
            ColorPencil colorPencil = ColorPencilFactory.getColorPencil(color);
            colorPencil.info();
        }
    }
}

댓글