Programming/Design Pattern

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

부풍 2009. 9. 18. 15:01
[출처] http://younghoe.info/170

1. 컨텍스트
효율을 높이기 위해서 다수의 작은 객체를 공유하는 것이다.

객체 지향 소프트웨어는 객체의 생성과 파괴라는 기본적인 주기에 따라 CPU 주기의 낭비, 가비지 컬렉션(garbage collection) 및 메모리 할당에 걸쳐 부하를 유발한다. 시스템이 이들 객체를 공유하게 된다면 부하를 피할 수 있다. 그러나, 특정 객체의 현재 사용자에게 국한된 정보는 공유할 수가 없다. Flyweight 패턴은 이러한 상태 정보를 객체의 재사용할 수 있는 부분과 분리시키는 접근 방법을 취한 것이다.

본질적인(intrinsic) 상태외래(extrinsic) 상태를 구분하는 것이 Flyweight 패턴의 핵심 개념이다. 본질적인 상태는 Flyweight 객체에 저장되어 있다. 이들 상태는 Flyweight의 컨텍스트에 독립적인 정보로 이루어지며, 공유가 가능하다. 외래 상태는 Flyweight의 컨텍스트에 따라 매우 다양하며, 공유가 불가능하다. 클라이언트 객체가 외래 정보를 요구할 때 이를 Flyweight에 전달할 의무를 지닌다.

2. 적용 영역
l        어플리케이션이 다수의 객체를 이용하는 경우
l        다수의 객체로 인해 저장에 고비용이 소요되는 경우
l        객체의 대부분의 상태 정보가 외래 상태(extrinsic state)화 할 수 있는 경우
l        외래 상태가 제거되는 경우 다수의 객체가 상대적으로 적은 숫자의 공유 객체로 대치될 수 있는 경우
l        어플리케이션이 객체의 식별자에 의존하지 않은 경우

3. 구조

4. 적용 결과
l        외래 상태를 전송하고, 찾아내는 과정에서 실행 시점의 비용(costs)을 초래할 수 있다. 이는 저장공간의 절약과 상충관계를 갖는다.
l        저장공간 절약은 다음 몇 가지 요인과 상관관계를 갖는다.

5. 관련 패턴
l        Flyweight 패턴은 종종 Composite 패턴과 결합되어 Leaf 노드를 공유하는 논리적인 그래프 구조를 구현한다.
l        State와 Strategy 객체를 Flyweight로 구현하는 것은 종종 최선책이 되기도 한다.