정의

프로그램을 개발하다 보면 두 가지 목적에서 공유를 고려하게 된다. 하나는 논리적인 관점에서, 다른 하나는 컴퓨터 자원을 효율적으로 사용하기 위해 공유가 필요한 경우이다. Flyweight 패턴은 한정된 메모리 공간 내에서 논리적으로 서로 구분되는 객체들을 공유를 통해 자원 사용량을 줄여주기 위한 설계이다.

그림 : 적군을 하나의 객체로 정의 할 때 각각의 객체가 이미지를 가지게 되면 중복되는 이미지가 많아 메모리 소모가 많아진다.

   

그림 : Flyweight 패턴으로 객체를 정의 한 형태. 이미지를 공유하는 형태로 사용된다.

   

용어

Intrinsic State : Flyweight 객체의 내부에 저장 관리되는 정보

Extrinsic State : Flyweight 객체의 외부에 저장 관리되는 정보

   

소스

객체 구성도

위의 그림에서 살펴보는 바와 같이 Client는 Enemy 객체를 생성하고, Enemy 객체를 이용해서 메모리 풀에 접근한다.

   

구현 고려사항

Flyweight 패턴을 적용할 시에 객체 공유를 통해 자원 사용량을 얼마나 많이 줄일 수 있냐를 잘 따져서 적용해야 된다.

Intrinsic State와 Extrinsic State가 분리되기가 쉽지 않거나 분리된다 하더라도 서로간의 관계를 유지하기 위해 또 다른 자원을 필요로 한다면 Flyweight 패턴을 사용하지 않는 것이 좋다.

공유할 객체를 생성하는 것은 Client가 직접 하는 것보다 대행 클래스에서 생성되게 하는 것이 좋다. (Factory Method 패턴) 또한 공유되는 객체는 중복적으로 생성될 필요가 없기 때문에 singleton 패턴으로 제한을 두는 것이 좋다.

만일 공유할 객체가 필요 없어서 소멸 해야 될 경우에 소멸되는 객체를 참조하는 객체가 더 이상 없다는 것을 확인을 해야 된다. 그것을 확인하기 위해 Reference Counting 기법이 적용된다.

패턴 활용처

응용 프로그램이 많은 객체를 필요로 하는데 사용 가능한 자원이 한정되어 있을 때

Extrinsic State 부분을 제외하고, 많은 그룹의 객체들이 상대적으로 적은 공유들로 대체 가능할 때

장점

Flyweight 패턴을 적용할 경우 저장공간이 적용되는 정도를 결정짓는 요인

1. 객체를 공유함으로써 감소되는 객체의 총 개수 : 많은 객체들을 공유 할수록 더 많은 저장공간이 절약된다.

2. 객체당 Intrinsic State의 양 : Intrinsic State의 양이 많을 수록 좋다.

3. Extrinsic State가 계산되는 것이냐 저장되는 것이냐에 따라 필요한 기억공간 : Extrinsic State는 저장되지 않고 계산 될 수 있으면 더 많은 저장공간을 절약 가능

'1. 디자인패턴 > Structural 정리' 카테고리의 다른 글

Proxy 패턴  (0) 2012.12.03
Flyweight 패턴  (0) 2012.12.02
Façade(퍼사드) 패턴  (0) 2012.12.02
Decorator(장식자) 패턴  (0) 2012.12.01
Composite(복합체) 패턴  (0) 2012.12.01
Bridge 패턴  (0) 2012.11.30
Posted by 싹쓰리