중복되는 정보를 공유 하는 방법을 플라이 웨이트 패턴이라고 합니다.
class CImageData { int m_nIdx; int m_nWidth, m_nHeight; char *m_pData; public: char *GetData(){return m_pData;} int GetWidth(){return m_nWidth;} int GetHeight(){return m_nHeight;} }; class CImagePool //CImageData의 객체 소유권은 CImagePool에 있다. { std::map<int, CImageData *>m_mapImageData; //여러이미지데이터를담고있는map이다. public: CImageData *GetImageData(int a_nIdx); //m_mapImageData에서, 해당idx를가진CImageData*를리턴한다. }; class CMenu { CImageData *m_pcImageData; public: CMenu(); ~CMenu(){} //여기서m_pcImageData를delete 하면큰일난다. void SetImageData(CImageData *a_pcImageData){m_pcImageData = a_pcImageData;} void Draw() { //m_pcImageData의픽셀데이터를통해서화면에메뉴이미지데이터를그린다. } }; |
팝업 메뉴마다 공유 될 수 있는 이미지 데이터를 메뉴 객체마다 따로 들고 있는 것은 메모리상의 중복이 생깁니다. 같은 이미지 데이터를 사용하는 메뉴 객체가 CImageData의 정보를 링크해 사용 한다면CImageData의 관리도 한 곳에서 이뤄지는
class CQuestInfo { int m_nQuestNo; //퀘스트식별번호 char m_szTItle[32]; //퀘스트이름 char m_szDesc[512]; //퀘스트설명 int m_nQuestMissionNo; //퀘스트목표에할당된번호 int m_nCompensateNo; //퀘스트보상번호 int m_nRequireProgressQuantity; //목표 달성을 위해 필요한 진행량 }; class CQuestInfoPool //CQuestInfo의객체소유권은CQuestInfoPool에게있다 { std::map<int, CQuestInfo *>m_mapQuestInfo; //CQuestInfo 데이터를담고있는map이다. public: CQuestInfo *GetQuestInfo(int a_nQuestNo); //m_mapQuestInfo에서, 해당QuestNo를가진CQuestInfo*를리턴한다. }; class CQuestData { int m_nIdx; //퀘스트고유번호 int m_nProgressQuantity; //진행량 CQuestInfo *m_pcQuestInfo; public: CQuestData ~CQuestData void SetQuestInfo(CQuestInfo *a_pcQuestInfo){m_pcQuestInfo =a_pcQuestInfo;} }; |
퀘스트의 경우에도 퀘스트의 종류에 따라 퀘스트 이름, 설명, 보상번호, 목표 번호, 목표 달성량 같은 것은 고정된 정보이고, 퀘스트의 고유 번호, 진행량과 같은 정보는 현재 진행중인 퀘스트마다 다르다.
이렇게 고정된 정보와 변할 수 있는 정보를 나누고, 고정된 정보를 묶고 링크해서 사용함으로써 플라이 웨이트 패턴을 구현할 수 있습니다.