2015년 6월 14일 일요일

팩토리 패턴 (factory pattern)

우선 패턴의 형태

케릭터 ( 하이엘프, 휴먼 .. )

케릭터 메이커 ( 플레이어 메이커, 몬스터 메이커...)

만들어야 할 것들을 저렇게 구분 짓는다.

////////////////////////////////////////////////////////////////////////////////
우선 케릭터 부분에서 대략적인 활용 방법은 

CCharacter pCharacter = pPlayerMaker->Create("HighElf");

pCharacter->무엇이든();

delete pCharacter;

이런 식으로 생성하고, 쓰이고, 삭제 될 것이다. 

케릭터 클래스로 객체를 만들고 그 종류에 상관 없이 쓰이는 함수를 쓰다가 삭제

메이커 역시 그 종류에 상관없이 이름만 넣으면 적절한 케릭터를 만들어 주도록.

////////////////////////////////////////////////////////////////////////////////

우선 만드는 행동을 하려면 만들 것들이 대략적이나마 정해져 있어야 하니 정하자

#include <string>

class CCharacter
{
protected:
     string m_strName;
     virtual void LoadDate() = 0;
public:
     string& GetName() { return m_strName; }
};
class CHighElf : public CCharacter
{
protected:
     void LoadDate() {}
public:
     CHighElf() { m_strName = "HighElf"; LoadDate(); }
};
class CHuman : public CCharacter
{
protected:
     void LoadDate() {}
public:
     CHuman () { m_strName = "Human"; LoadDate(); }
};

다 되었다면 메이커도 만들자

class CCharacterMaker
{
protected:
     virtual CCharacter* Make(string& strType) = 0;//세부 메이커에서 구현
public:
     CCharacter* Create(string& strType)
     {
          CCharacter* pCharacter = Make(strType);
          return pCharacter;
     }
};
class CPlayerMaker : public CCharacterMaker
{
protected:
     CCharacter* Make(string& strType)
     {
          CCharacter* pCharacter = NULL;
          if( strType == string("HighElf") )
          { 
               pCharacter = new CHighElf();
          }
          else if( strType == string("Human") )
          { 
               pCharacter = new CHuman();
          }

          return pCharacter;
     }
};

이제 메인문에서 써먹어 보는 부분
int _tmain(int argc, _TCHAR* argv[])
{
CCharacter* pChar = NULL;
CCharacterMaker* pCharMaker = new CPlayerMaker();

pChar = pCharMaker->Create(string("HighElf"));
printf("%s 케릭터 생성\n", pCharacter->GetName().c_str());
delete pChar ;

return 0;
}

이것이 기본적인 팩토리 패턴이다.

이렇게 하면 케릭터를 만드는 부분에서 이름만 수정하면

다른부분, 예를 들면 행동하는 부분에서 코드를 수정하지 않아도 될것으로 보인다.

또한 개별 행동을 클래스 개별적으로 수정, 보완 할 수 있으니 다음에 찾아서 고쳐야 할때

찾기도 편하고 다시 이해 하기도 편할 것 같다.

댓글 없음:

댓글 쓰기