케릭터 ( 하이엘프, 휴먼 .. )
케릭터 메이커 ( 플레이어 메이커, 몬스터 메이커...)
만들어야 할 것들을 저렇게 구분 짓는다.
////////////////////////////////////////////////////////////////////////////////
우선 케릭터 부분에서 대략적인 활용 방법은
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;
}
이것이 기본적인 팩토리 패턴이다.
이렇게 하면 케릭터를 만드는 부분에서 이름만 수정하면
다른부분, 예를 들면 행동하는 부분에서 코드를 수정하지 않아도 될것으로 보인다.
또한 개별 행동을 클래스 개별적으로 수정, 보완 할 수 있으니 다음에 찾아서 고쳐야 할때
찾기도 편하고 다시 이해 하기도 편할 것 같다.
댓글 없음:
댓글 쓰기