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이 참조하게 만들었다.
'이전게시판 > C, C++' 카테고리의 다른 글
c++ 전처리기 region 이란 (0) | 2018.09.30 |
---|---|
pragma message 출력창에 내용 출력 (0) | 2018.08.29 |
Cygwin 설치 설정 방법 (0) | 2018.07.27 |
서버 파싱 중 이진수 데이터 조합 (0) | 2018.06.20 |
VisualStudio 줄번호 바로가기 단축키 (0) | 2018.06.05 |
const와 포인터 (0) | 2018.05.30 |
C3083 왼쪽의 기호는 형식이어야 합니다 에러 정방선언... (0) | 2018.05.03 |
typedef한 자료형의 별명을 리턴값으로 사용시 에러... (0) | 2018.04.26 |