Post

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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
// ConsoleApplication1.cpp: 콘솔 응용 프로그램의 진입점을 정의합니다.
//
 
#include "stdafx.h"
#include <vector>
using namespace std;
 
class Flyweight
{
public:
    struct Stock
    {
        int nType;    // 0 : 전사 1 : 마법사
        int nMaxHP;
        int nStr;
        int nDef;
    };
 
private:
    Stock m_stock;
 
public :
 
    void SetStock(Stock stock)
    {
        m_stock = stock;
    }
 
    Stock& GetStock()
    {
        return m_stock;
    }
 
    void Print(int index)
    {
        printf("유닛%d Type:%d MaxHP:%d \n", index, m_stock.nType, m_stock.nMaxHP);
    }
 
};
 
class Unit
{
private:
    Flyweight * m_pFly;
 
public :
    void SetFly(Flyweight* pFly)
    {
        m_pFly = pFly;
    }
 
    Flyweight* GetFly()
    {
        return m_pFly;
    }
};
 
class Container
{
    vector<Flyweight*> m_Container;
 
public:
    ~Container()
    {
        vector<Flyweight*>::iterator it;
        for (it = m_Container.begin(); it != m_Container.end();)
        {
            it = m_Container.erase(it);
        }
    }
 
    void Insert(int nType)
    {    
        Flyweight* pNewFly = new Flyweight();
        
        Flyweight::Stock stock;
        // 타입은 전사, 마법사로 나뉘고 타입별로 스탯은 동일하다
        if (0 == nType)
        {
            stock.nType = 0;
            stock.nMaxHP = 100;
            stock.nStr = 20;
            stock.nDef = 10;
        }
        else
        {
            stock.nType = 1;
            stock.nMaxHP = 50;
            stock.nStr = 40;
            stock.nDef = 5;
        }
        pNewFly->SetStock(stock);
        m_Container.push_back(pNewFly);
    }
 
    Flyweight* Search(int nType)
    {
        Flyweight* pFly = m_Container.at(nType);
        return pFly;
    }
};
static Container UnitContainer;
 
// 유닛 생성
class UnitManager
{
    vector<Unit*> m_UnitList;
 
public :
    ~UnitManager()
    {
        vector<Unit*>::iterator it;
        for (it = m_UnitList.begin(); it != m_UnitList.end();)
        {
            it = m_UnitList.erase(it);
        }
    }
 
    void Create(int nType)
    {
        Unit* pUnit = new Unit();
 
        Flyweight* pFly = NULL;
        pFly = UnitContainer.Search(nType);
        pUnit->SetFly(pFly);
        m_UnitList.push_back(pUnit);
    }
 
    Unit* Get(int i)
    {
        return m_UnitList.at(i);
    }
};
 
int main()
{
    // Fly 정보 추가
    UnitContainer.Insert(0);
    UnitContainer.Insert(1);
 
    UnitManager unitManager;
    for (int i = 0; i < 10++i)
    {
        unitManager.Create(0);
    }
 
    for (int i = 0; i < 10++i)
    {
        unitManager.Create(1);
    }
 
    unitManager.Get(1)->GetFly()->Print(1);
    unitManager.Get(3)->GetFly()->Print(3);
    unitManager.Get(9)->GetFly()->Print(9);
    unitManager.Get(10)->GetFly()->Print(10);
    unitManager.Get(15)->GetFly()->Print(15);
    unitManager.Get(19)->GetFly()->Print(19);
 
 
    //getchar();
}
 
 
cs



출력결과

유닛1 Type:0 MaxHP:100

유닛3 Type:0 MaxHP:100

유닛9 Type:0 MaxHP:100

유닛10 Type:1 MaxHP:50

유닛15 Type:1 MaxHP:50

유닛19 Type:1 MaxHP:50



flyweight패턴

사용상황 : 디팬스 게임에서 내가 정중앙에 있고 적들이 사방에서 엄청 몰려올 때, 적의 수 만큼 데이터가 필요하다.

너무 많은 데이터가 필요하다면 공통된 정보는 공유해서 사용하는 방법이 Flyweight 패턴이다.

위 예제는 타입, 최대hp, 공격력, 방어력이 유닛타입(전사, 마법사) 에 따라 같다고 했을 때, 이는 공통되는 속석이므로,

공통되는 속성을 Flyweight로 묶어서 Unit이 참조하게 만들었다. 

 

▲ top