플라이웨이트 패턴(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();
}
}
}