요즘 흔히 얘끼하는 프로토타입은 디자인패턴의 그것과는 다르다. 이번에는 프로토타입 패턴도 다루지만 더 흥미로운 주제인 ‘프로토 타입’용어와 개념이 어떻게 유래되었는지 알아볼것이다.

프토토타입 디자인 패턴

<건틀릿>같은 게임을 만든다고 하자. 몬스터들은 영웅을 잡아먹기 위해 뗴지어 다닌다.

영웅을 저녁 식사 삼으려는 이 음침 녀서들은 게임마다 등장하는데 몬스터 종류마다 따로 존재한다.

몬스터(Ghost, Demon, Sorcerer)같은 클래슬 만들어보자

class Monster
{
  // Stuff...
};

class Ghost : public Monster {};
class Demon : public Monster {};
class Sorcerer : public Monster {};

한 가지 스포너는 한 가지 몬스터 인스터스만 만든다. 게임에 나오는 모든 몬스터를 지원하기 위해 일단 마구잡이로 몬스터 클래스마다 스포너클래스를 만든다고 치자. 이렇게하면 스포너클래스가 상속구조인 몬스터를래스를 따라서 비슷한 형태로 만들어지게 된다.

prototype-hierarchies.png

class Spawner
{
public:
  virtual ~Spawner() {}
  virtual Monster* spawnMonster() = 0;
};

class GhostSpawner : public Spawner
{
public:
  virtual Monster* spawnMonster()
  {
    return new Ghost();
  }
};

class DemonSpawner : public Spawner
{
public:
  virtual Monster* spawnMonster()
  {
    return new Demon();
  }
};

// You get the idea...

코드를 많이 작성할수록 돈을 더 많는다면 위방식이 개발자한테는 더 좋은 방식일 것이다. 클래스도 많아지지… 행사코드도 길어지지… 반복코드도 많아지지… 중복도 많지…

이런걸 프로토 타입으로 해결할 수 있다. 핵심은 어떤 객체가 자기와 비슷한 객체를 스폰할수 있다는 점이다. 유령 객체 하나로는 다른 유령객체를 여럿 만들수 있다. 악마 객체로 부터도 다른 악마개체를 만들 수 있다. 어떤 몬스터 객체든지 자신하고 비슷한 몬스터를 만드는 prototype(원형)객체로 사용 할 수 있다.

이를 구현하기 위해서 몬스터 클래스에 순수가상함수인 clone()을 추가한다.

class Monster
{
public:
  virtual ~Monster() {}
  virtual Monster* clone() = 0;

  // Other stuff...
};