11. 플라이급 패턴(Flyweight Pattern) 구현

11. 4 구현

 플라이급 패턴의 예제 프로그램은 Meta, MetaPool, PictureFile, 데모 코드 순으로 구현합시다.

 

11.4.1 Meta

Meta 형식에서는 카메라의 Body 종류에 대한 열거형 멤버와 렌즈 종류에 해당하는 열거형 멤버, 조명에 대한 열거형 멤버를 갖고 있게 합시다. 그리고 같은 멤버의 값을 가졌는지 비교하는 메서드와 이들 정보를 보여주는 메서드를 제공할 것입니다.

▶ Meta.cs

 

11.4.2 MetaPool

MetaPool은 같은 멤버 값을 갖지 않게 Meta 개체들을 관리하는 개체입니다. MetaPool에서는 원하는 상태를 갖는 Meta 개체를 참조할 수 있는 메서드를 제공해야 합니다. 여기에서는 MakeMeta 이름을 갖는 메서드로 제공할 것입니다. 

MakeMeta 메서드에서는 입력 인자로 들어온 Body 종류, 렌즈 종류, 조명을 값으로 하는 Meta 개체가 이미 존재하는지를 확인합니다. 이미 존재한다면 해당 Meta 개체를 반환하고 존재하지 않을 때에는Meta 개체를 생성하여 보관하고 이를 반환하게 작성하면 될 것입니다. 그리고 MetaPool 개체를 단일체(Singleton)로 정의하였습니다. 

▶ MetaPool.cs

 

11.4.3 PicureFile

PictureFile은 MetaPool을 통해 사진이 찍은 환경에 해당하는 Meta 개체의 위치 정보를 갖도록 구현해 봅시다. 생성자 메서드에서는 사진 이름과 사진을 찍은 환경 값에 해당하는 Body 종류, Lens 종류, 조명 값을 인자로 받습니다. 생성자에서 입력 인자를 값으로 하는 Meta 개체를 참조하기 위하여 MetaPool 단일체 개체의 MakeMeta 메서드를 호출합니다. 모든 PictureFile마다 사진을 찍은 환경 정보를 갖고 있게 하였다면 같은 정보를 갖는 PictureFile 개체가 많아지면 메모리 효율이 떨어집니다. 하지만 예제 프로그램처럼 플라이급 패턴을 적용하면 같은 정보를 갖는 PictureFile 개체가 아무리 많아져도 환경 정보가 같은 개체들은 하나의 Meta 개체를 참조하므로 메모리 효율을 높일 수 있습니다. 

▶ PictureFile.cs


11.4.4
데모 코드  

▶ Program.cs

▶ 실행 결과