플라이웨이트 패턴이란?
"객체의 재사용"을 목적으로 한 디자인 패턴
- 같은 데이터를 공유하는 객체는 공유해서 메모리 절약하자
사용법
- 데이터 레이어 - 메모리에 저장된 수많은 비슷한 객체 사이로 데이터를 공유하는 방식
- DOM 레이어 - 부모 요소 같은 중앙 이벤트 관리자에게 맡기는 방식
데이터 공유
- 내재적 정보: 객체 내부 메서드에 필요하며, 없으면 동작하지 못한다.
- 팩토리 메서드를 통해 하나의 공유된 객체로 대체한다.
- 외재적 정보: 따로 관리자를 둔다.
- 플라이웨이트 객체와 내재적 상태를 보관하는 중앙 데이터베이스를 관리자로 사용한다.
구현 방법
- 플라이웨이트: 외부의 상태를 받아 작동할 수 있게 하는 인터페이스
- CoffeeOrder
- 구체적 플라이웨이트: 다양한 컨택스트 사이에서 공유될 수 있어야하며, 외부 상태를 조작할 수 있어야 한다.
- CoffeeFlavor
- 플라이웨이트 팩토리: 플라이웨이트 객체를 생성하고 재사용할 수 있도록 관리한다.
- CoffeeFlavorFactory
- Duck Punching: 런타임 소스를 수정할 필요 없이 언어나 솔루션의 기능을 확장할 수 있게 해준다. → implements
Coffee 주문 - 플라이웨이트 패턴
- CoffeeFlavor 객체 재사용
- "Cappuccino"를 처음 주문하면 new CoffeeFlavor("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);
- 플로우차트: draw.io
'[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 |