[Web-Front] React/[TAVE] React Design Pattern Study

플라이웨이트 패턴

유진진 2025. 5. 15. 21:34

플라이웨이트 패턴이란?

"객체의 재사용"을 목적으로 한 디자인 패턴

  • 같은 데이터를 공유하는 객체는 공유해서 메모리 절약하자

 

사용법

  1. 데이터 레이어 - 메모리에 저장된 수많은 비슷한 객체 사이로 데이터를 공유하는 방식
  2. DOM 레이어 - 부모 요소 같은 중앙 이벤트 관리자에게 맡기는 방식

 

데이터 공유

  • 내재적 정보: 객체 내부 메서드에 필요하며, 없으면 동작하지 못한다.
    • 팩토리 메서드를 통해 하나의 공유된 객체로 대체한다.
  • 외재적 정보: 따로 관리자를 둔다.
    • 플라이웨이트 객체와 내재적 상태를 보관하는 중앙 데이터베이스를 관리자로 사용한다.

 

 

구현 방법

  • 플라이웨이트: 외부의 상태를 받아 작동할 수 있게 하는 인터페이스
    • CoffeeOrder
  • 구체적 플라이웨이트: 다양한 컨택스트 사이에서 공유될 수 있어야하며, 외부 상태를 조작할 수 있어야 한다.
    • CoffeeFlavor
  • 플라이웨이트 팩토리: 플라이웨이트 객체를 생성하고 재사용할 수 있도록 관리한다.
    • CoffeeFlavorFactory
  • Duck Punching: 런타임 소스를 수정할 필요 없이 언어나 솔루션의 기능을 확장할 수 있게 해준다. → implements

 

Coffee 주문 - 플라이웨이트 패턴

  • CoffeeFlavor 객체 재사용
    • "Cappuccino"를 처음 주문하면 new CoffeeFlavor("Cappuccino") 생성
    • 두 번째부터는 이미 있는 객체를 리턴한다.
    즉, "Cappuccino"라는 맛은 하나의 인스턴스만 공유해서 계속 사용
class CoffeeFlavorFactory {
  constructor() {
    this.flavors = {}; // 같은 맛은 하나만 생성
    this.length = 0;
  }

  getCoffeeFlavor(flavorName) {
    let flavor = this.flavors[flavorName];
    if (!flavor) { // 첫 주문인 경우 
      flavor = new CoffeeFlavor(flavorName); // 처음만 생성
      this.flavors[flavorName] = flavor;
      this.length++;
    }
    return flavor; // 다음부터는 같은 객체 리턴
  }
}

 

  • 상황(Context)은 따로 둠
    • 커피의 고정 속성(맛) 은 공유 (CoffeeFlavor)
    • 변하는 속성(테이블 번호 등) 은 따로 context로 분리해서 넘김
const CoffeeOrderContext = (tableNumber) => ({
  getTable() {
    return tableNumber;
  },
});

 

 

  • 고정 속성은 공유하고, 가변 속성은 context로 분리한다!
  • 효과
    • 테이블 100개에 "Cappuccino" 100잔 주문 들어올 때 100개의 객체 생성하지만,
    • 플라이웨이트를 쓰면 "Cappuccino" 는 1개 객체만 생성되고 재사용된다.
  • 결과 (testFlyweight.js)
    • 3 잔 주문이 들어왔다.
    • 하지만 CoffeeFlavor 객체 3개가 아닌 맛 종류에 따라 2개만 생성된다.
    • Cappuccino는 동일한 객체를 반환한다! == 재사용한다.
      takeOrders("Cappuccino", 2); // 카푸치노 맛으로 테이블 2번
      takeOrders("Cappuccino", 3);
      takeOrders("Espresso", 5);
      ​

 

 

 

'[Web-Front] React > [TAVE] React Design Pattern Study' 카테고리의 다른 글

비동기 프로그래밍 패턴  (0) 2025.05.15
렌더링 패턴  (2) 2025.05.15
리액트 디자인 패턴  (1) 2025.05.15
주요 기초 디자인 패턴 3가지  (1) 2025.05.15