Java/Design Pattern

[헤드퍼스트 디자인 패턴] 12-4. 플라이웨이트 패턴

noahkim_ 2024. 12. 19. 00:28

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다


1. 플라이웨이트 패턴

  • 객체를 최대한 재사용하여 메모리를 절약하는 디자인 패턴
  • 인스턴스 하나로 여러 개의 가상 인스턴스를 제공하고 싶을 경우

 

구성 요소

Intrinsic State
  • 여러 객체 간에 공유되는 상태
  • 불변

 

Extrinsic State
  • 공유되지 않고 개별 객체에 따라 달라지는 상태
  • 호출 시 클라이언트가 전달

 

2. TreeManager

import java.util.ArrayList;
import java.util.List;

public class TreeManager {
    private final List<TreeLocation> trees = new ArrayList<>();

    // 나무 추가 (외재적 상태를 포함한 TreeLocation 객체 생성)
    public void plantTree(int x, int y, String type, String color, String texture) {
        Tree tree = TreeFactory.getTree(type, color, texture);
        trees.add(new TreeLocation(x, y, tree));
    }

    // 모든 나무 표시
    public void displayTrees() {
        for (TreeLocation treeLocation : trees) {
            treeLocation.display();
        }
    }

    // TreeLocation: 외재적 상태와 플라이웨이트 Tree를 함께 보관
    private static class TreeLocation {
        private final int x; // 외재적 상태
        private final int y; // 외재적 상태
        private final Tree tree; // 내재적 상태를 가진 Tree 객체

        public TreeLocation(int x, int y, Tree tree) {
            this.x = x;
            this.y = y;
            this.tree = tree;
        }

        public void display() {
            tree.display(x, y);
        }
    }
}
public class Tree {
    private final String type;   // 내재적 상태
    private final String color;  // 내재적 상태
    private final String texture; // 내재적 상태

    public Tree(String type, String color, String texture) {
        this.type = type;
        this.color = color;
        this.texture = texture;
    }

    public void display(int x, int y) { // 외재적 상태는 메서드 호출 시 전달
        System.out.println(
            String.format("Tree [type=%s, color=%s, texture=%s] at (%d, %d)",
                          type, color, texture, x, y)
        );
    }
}