Thinking Different







Prototype Pattern - 원형 패턴

  • 미리 만들어진 개체(object)를 복사하여 개체를 생성하는 패턴이다.
  • 다수의 객체 생성시에 발생되는 객체의 생성 비용을 효과적으로 줄일 수 있다.





샘플 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//------------------------------------------------------------------
// Prototype 인터페이스 클래스
class Prototype
{
public:
    virtual Prototype* Clone() = 0;
};
 
//------------------------------------------------------------------
// ConcretePrototype1 클래스
class ConcretePrototype1 : public Prototype
{
public:
    ConcretePrototype1() {}
    ConcretePrototype1(const ConcretePrototype1& p) {}
public:
    Prototype* Clone() override final
    {
        return new ConcretePrototype1(*this);
    }
};
 
//------------------------------------------------------------------
// ConcretePrototype2 클래스
class ConcretePrototype2 : public Prototype
{
public:
    ConcretePrototype2() {}
    ConcretePrototype2(const ConcretePrototype2& p) {}
public:
    Prototype* Clone() override final
    {
        return new ConcretePrototype2(*this);
    }
};
 
 
//------------------------------------------------------------------
// Main
int _tmain(int argc, _TCHAR* argv[])
{
    Prototype* pOriginal = new ConcretePrototype1();
    Prototype* pClone = pOriginal->Clone();
    
    delete pClone;
    delete pOriginal;
 
    return 0;
}



예제를 통한 원형 패턴(Prototype Pattern) 알아보기



예제) 아이템 복사 생성



아이템을 복사 생성하는 예제를 들었다, 상점에서 게임 사용자가 아이템을 구매시 미리 만들어놓은 아이템 객체를 통한 복사 생성을 통해 객체를 넘겨줌으로써 생성에 필요한 오버헤드를 감소할 수 있다.

또 다른 예로, 몬스터들의 필드 리스폰 (재생성, 여기서는 유저 사냥으로 사라진 몬스터를 다시 생성)에 대해서 이미 만들어져있는 필드상의 몬스터를 통해 복제 생성으로 생성시의 오버헤드를 줄일 수 있다.



예제 코드)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//------------------------------------------------------------------
// 아이템 인터페이스
class 아이템_인터페이스
{
public:
    virtual 아이템_인터페이스* Clone() = 0;
};
 
//------------------------------------------------------------------
// 물약 클래스
class 방패 : public 아이템_인터페이스
{
public:
    방패() {}
    방패(const 방패& c) {}
    아이템_인터페이스* Clone() override { return new 방패(*this); }
};
 
//------------------------------------------------------------------
// 지도 클래스
class 지도 : public 아이템_인터페이스
{
public:
    지도() {}
    지도(const 지도& c) {}
    아이템_인터페이스* Clone() override { return new 지도(*this); }
};
 
//------------------------------------------------------------------
// Main
int _tmain(int argc, _TCHAR* argv[])
{
    아이템_인터페이스* pShield = new 방패();
    아이템_인터페이스* pClone = pShield->Clone();
 
    delete pClone;
    delete pShield;
 
    return 0;
}