원형이 되는 인스턴스를 사용하여 생성할 객체의 종류를 명시하고, 이렇게 만든 견본을 복사해서 새로운 객체를 생성합니다.(GoF의 디자인 패턴 169p)
특정 클래스들과 1대1로 연관되는 새로운 클래스들을 만들 때 연관된 클래스들을 하나의 클래스로 만들어서 클래스 수를 줄이는 방법이다.

#include <iostream>
using namespace std;
class C_Monster
{
public:
virtual ~C_Monster() {}
virtual shared_ptr<C_Monster> Clone() = 0;
};
class C_Ghost : public C_Monster {
public:
C_Ghost(int health, int speed)
:health_(health), speed_(speed) {}
virtual shared_ptr<C_Monster> Clone() override{
return make_shared<C_Ghost>(health_, speed_);
}
private:
int health_;
int speed_;
};
class C_Demon : public C_Monster {
public:
C_Demon(int health, int speed)
:health_(health), speed_(speed) {}
virtual shared_ptr<C_Monster> Clone() override {
return make_shared<C_Demon>(health_, speed_);
}
private:
int health_;
int speed_;
};
class C_Sorceror : public C_Monster {
public:
C_Sorceror(int health, int speed)
:health_(health), speed_(speed) {}
virtual shared_ptr<C_Monster> Clone() override {
return make_shared<C_Sorceror>(health_, speed_);
}
private:
int health_;
int speed_;
};
class C_Spawner {
virtual ~C_Spawner() {}
virtual C_Monster* Spawn_Monster() = 0;
};
template <class T>
class C_Spawner_For : public C_Spawner {
public:
virtual shared_ptr<C_Monster> Spawn_Monster() override { return make_shared<T>(); }
};
int main()
{
auto ghost_spawner = make_shared<C_Spawner_For<C_Ghost>>();
}