게임을 플레이할 때에 우리는 수 많은 게임 캐릭터들을 볼 수 있다. 각각의 캐릭터는 아이템, 체력등 다양한 정보들을 담고 있다. 이러한 캐릭터들을 많이 생성해야할 때 우리는 어떠한 방식으로 프로그램을 설계해야할까?
플라이웨이트 패턴은 객체를 관리하는 클래스를 따로 두어 설계하는 패턴이다. 관리를 위해서는 공유하는 부분과 그렇지 않은 부분을 나누어 구분해준다.
그렇다면 어떠한 방식으로 공유 부분과 공유되지 않는 부분을 나누었나 보자. 일단 공유되는 부분을 extrinsic, 공유되지 않는 개인적은 영역을 intrinsic이라고 부른다.
Flyweight 클래스는 extrinsic data에 대한 operation을 처리한다고 한다. (이 부분은 충분히 이해하지 못했다.) concreteFlyweight와 unsharedConcreteFlyweight의 인터페이스를 제공한다.
ConcreteFlyweight는 공유 될 수 있는 객체들을 표현한다. 반대로 UnsharedConcreteFlyweight 클래스는 공유되지 않는 클래스이다.
Flyweight Factory 클래스는 flyweight를 생성하고 관리한다. aggregation으로 연결된 것은 다수의 flyweight를 객체를 이용하여 관리할 수 있음을 의미하는 듯하다. flyweight의 인스턴스를 생성하는 역할을 한다.
플라이웨이트 패턴을 이용할 경우, 복잡한 데이터를 가진 객체의 정보를 모으기 때문에 공간을 절약(Storage Savings) 할 수 있다. 그러나 관리하는 공유 데이터에 대한 처리가 필수적이기 때문에 더욱 복잡한 외부 관리(Management of Extrinsic State)가 필요하다. 따라서 이 패턴을 적용할지 여부를 잘 판단해야한다.
플라이웨이트 패턴은 Singleton 패턴과 함께 이용될 수 있다. Singleton 패턴이란 객체를 단 하나만 만들어서 이용하고 싶을 때에 사용하는 패턴이다.
플라이웨이트 패턴에서 singleton 패턴을 이용하는 이유는 공유 데이터가 담길 flyweightFactory 클래스가 단 하나만 생성되어야하기 때문이다.