팩토리메서드 --------------------------------------------------------------------------------------------------

팩토리 메서드는 객체를 생성하기 위한 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할 지에 대한 결정은 서브클래스가 내리도록 하는 패턴입니다.

상속과 다형성을 이용하는 방법입니다.


패턴 적용 스토리 -----------------------------------------------------------------------------------------------

게임내에서 아이템드랍방식을 생각해보면 몬스터가 죽였을때 아이템이 생성되어야 합니다.

아이템의 종류는 무기, 방패, 갑옷의 세종류가 있으며 타입마다 다른 아이템을 사용하여 리턴합니다.

팩토리 메서드패턴은 생성 클래스 자체를 추상화하여 각 아이템별 생성클래스를 생성하거나 혹은 생성 클래스 내부에서 인자값을 받아 그에 맞는 아이템클래스를 생성할수 있습니다.

이번에는 인자값을 받아서 그에 맞는 아이템 클래스를 생성하는 패턴으로 가보겠습니다.





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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#pragma once
 
#include "stdafx.h"
 
enum ITEM_TYPE
{
    ITEM_TYPE_WEAPON,
    ITEM_TYPE_SHIELD,
    ITEM_TYPE_ARMOR,
    ITEM_TYPE_COUNT
};
 
class CItem
{
public:
    CItem(void) {}
    ~CItem(void) {}
};
 
class CWeapon
    : public CItem
{
public:
    CWeapon(void) {}
    ~CWeapon(void) {}
};
 
class CShield
    : public CItem
{
public:
    CShield(void) {}
    ~CShield(void) {}
};
 
class CArmor
    : public CItem
{
public:
    CArmor(void) {}
    ~CArmor(void) {}
};
 
class CItemCreator
{
public:
    CItem* CreateItem(ITEM_TYPE eItemType)
    {
        CItem* pItem = NULL;
        switch(eItemType)
        {
        case ITEM_TYPE_WEAPON:
            pItem = new CWeapon;
            cout << "무기가 드랍됨" << endl;
            break;
        case ITEM_TYPE_SHIELD:
            pItem = new CShield;
            cout << "방패가 드랍됨" << endl;
            break;
        case ITEM_TYPE_ARMOR:
            pItem = new CArmor;
            cout << "갑옷이 드랍됨" << endl;
            break;
        default:
            cout << "꽝 아이템 없음 ㅋㅋㅋ" << endl;
            break;
        }
 
        return pItem;
    }
 
public:
    CItemCreator(void) {}
    ~CItemCreator(void) {}
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    srand((unsigned)time(NULL));
    CItemCreator ItemCreate;
 
    for(int i = 0; i < 10 ; ++i)
    {
        srand((unsigned)time(NULL));
        int j = rand() % 5;
        Sleep(500);
        ItemCreate.CreateItem( (ITEM_TYPE)(j) );
    }
 
    return 0;
}
 



Posted by JJOREG