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

구교석·2024년 3월 24일
post-thumbnail

플라이웨이트 패턴(Flyweight Pattern) 은 구조 패턴 중 하나로 이는 소프트웨어에서 특정한 문제를 해결하기 위해 반복적으로 발생하는 구조를 식별하고, 그 구조에 따라 일반화된 해결책을 제시하는 것을 의미합니다.
한마디로 일괄적으로 관리할 수 있도록 만드는 패턴입니다.

플라이웨이트 패턴이란?

플라이웨이트는 각 객체에 모든 데이터를 유지하는 대신 여러 객체들 간에 상태의 공통 부분들을 공유하여 사용할 수 있는 RAM에 더 많은 객체들을 포함할 수 있도록 하는 구조 디자인 패턴입니다.
나무는 색(color)을 정할 수 있고, 특정 위치(x, y)에 세울 수 있습니다.

만약 마크에 미쳐서 나무 10000개를 맵에 심는다고 할 때,
나무 한 그루에 들어가는 데이터는
color : 4Byte , x: 4byte, y:4byte 라고 합시다.
모든 나무를 심을 때마다 객체를 생성한다면, 나무 10,000개에는 120,000byte 가 듭니다.
이렇듯 나무가 하나 늘어날 수록 데이터가 선형적으로 늘어남으로 언젠가 메모리가 버티지 못하는 상황이 오게될것입니다.
이런 상황에서 사용할 수 있는 패턴이 플라이웨이트 패턴입니다.

플라이웨이트 패턴 구조

플라이웨이트 패턴 코드

public class Tree {

    // 나무는 아래와 같이 3개 정보를 가지고 있습니다.
    private String color;
    private int x;
    private int y;

    //색상으로만 생성자를 만들어줄게요.
    public Tree(String color) {
        this.color = color;
    }

    public void setX(int x) {
        this.x = x;
    }

    public void setY(int y) {
        this.y = y;
    }

    //나무를 심을 때
    public void install(){
        System.out.println("x:"+x+" y:"+y+" 위치에 "+color+"색 나무를 설치했습니다!");
    }
}
public class TreeFactory {
    //HashMap 자료구조를 활용해서 만들어진 나무들을 관리해볼게요
    public static final HashMap<String, Tree> treeMap = new HashMap<>();
    
   
    public static Tree getTree(String treeColor){
        //Map에 입력받은 색상의 나무가 있는지 찾습니다. 있으면 그 객체를 제공합니다.
        Tree tree = (Tree)treeMap.get(treeColor); 

       //만약 아직 같은 색상의 나무가 Map에 없다면 새로 객체를 생성해 제공합니다.
        if(tree == null){
            tree = new Tree(treeColor);
            treeMap.put(treeColor, tree);
            System.out.println("새 객체 생성");
        }

        return tree;
    }
}
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.println("원하는 색을 입력해주세요 :)");
        for(int i=0;i<10;i++){
            //나무 색 입력받기
            String input = scanner.nextLine();
            //팩토리에서 나무 하나 공급받기
            Tree tree = (Tree)TreeFactory.getTree(input);
            //나무 x,y 설정하고
            tree.setX((int) (Math.random()*100));
            tree.setY((int) (Math.random()*100));
            //나무 설치하기
            tree.install();
        }

    }
}

참고 사이트


💠 경량(Flyweight) 패턴 - 완벽 마스터하기

[디자인 패턴] Flyweight 패턴

profile
끊임없이 노력하는 개발자

0개의 댓글