{ νλ‘ν νμ μ΄λ? }
νλ‘ν νμ ν¨ν΄μ΄λ GoFμ μμ± ν¨ν΄ μ€ νλλ‘,
μλ³Έ κ°μ²΄(νλ‘ν νμ )λ₯Ό 볡μ νμ¬ κ°μ²΄λ₯Ό μμ±νλ ν¨ν΄μ΄λ€.
{ κ²μ κ°λ°μμ νλ‘ν νμ νμ©νκΈ° : λͺ¬μ€ν° λλ μ€ν°νκΈ° }
μ κ²μμ 보면 μλ§μ λͺ¬μ€ν°λ€μ΄ λλ μμ±λμ΄ μλ€.
μ΄λ° λͺ¬μ€ν° μμ± μ½λλ₯Ό μ΄λ»κ² νλ©΄ κ°λ¨νκ² μμ±ν μ μμκΉ?
λͺ¬μ€ν° μ€ν¬λμ νλ‘ν νμ μΌλ‘ μ¬μ©ν λͺ¬μ€ν° κ°μ²΄λ₯Ό λ±λ‘ν΄λκ³ λ³΅μ (Clone)νμ¬ κ²μ μλ μμ λ°°μΉ μν€λ©΄ λμ΄λ€.
νλ‘ν νμ ν¨ν΄μ μλ³Έ κ°μ²΄λ₯Ό 볡μ¬ν λ νλ‘ν νμ μ ν΄λμ€ λΏλ§ μλλΌ μνλ κ°μ΄ 볡μ νλ€.
μ΄ λ§μ λͺ κ°μ μμ±μ λ³κ²½νλ κ²λ§μΌλ‘λ νλμ νλ‘ν νμ μμ λ€μν μ’ λ₯μ κ°μ²΄λ₯Ό μμ±ν μ μλ€λ κ²μ΄λ€.
μλ₯Ό λ€μ΄ μ λλ©μ΄μ μ λ³΄λ§ λ°κΏ λ€λ₯Έ μΈνμ κ°μ§ λͺ¬μ€ν°λ‘ λ°κΏ μ μμΌλ©°,
ν¬κΈ°μ 체λ ₯λ§ λ°κΏ κ±°λ λͺ¬μ€ν°λ₯Ό λ§λ€μ΄λΌ μ μλ€.
μ°μ λͺ¬μ€ν°μ μ½λλ₯Ό μμ±ν΄λ³΄μ.
λͺ¬μ€ν°μμ μ€μν μ μ λͺ¬μ€ν° κ°μ²΄λ₯Ό 볡μ¬ν μ μλ λ³΅μ¬ μμ±μκ° μμ΄μΌ νλ€λ κ²μ΄λ€.
// monster.h
class Monster
{
public:
static int count;
private:
string name;
float hp;
float damage;
float speed;
public:
Monster(const string& _name)
: name(_name)
, hp(100.f)
, damage(10.f)
, speed(6.f)
{
++count;
}
virtual ~Monster()
{
--count;
}
Monster(const Monster& _monster)
: name(_monster.name + to_string(count))
, hp(_monster.hp)
, damage(_monster.damage)
, speed(_monster.speed)
{
++count;
}
const string& GetName()
{
return name;
}
};
int Monster::count = 0;
μ€ν¬λμ μ½λλ λ€μκ³Ό κ°λ€.
ν νλ¦Ώμ μ¬μ©νλ©΄ μ‘°κΈ λ λ²μ©μ μΈ μ€ν¬λλ₯Ό λ§λ€ μ μλ€.
// spawner.h
template<class T>
class Spawner
{
protected:
T* proto;
public:
virtual ~Spawner()
{
delete(proto);
}
virtual T* Spawn() = 0;
virtual void SetProto(T* _proto) { proto = _proto; }
};
class SpawnerForMonster : public Spawner<Monster>
{
public:
virtual Monster* Spawn() override
{
return new Monster(*static_cast<Monster*>(proto));
}
};
λ§μ§λ§μΌλ‘ SpawnerForMonsterλ₯Ό μ΄μ©ν΄ λͺ¬μ€ν° "Skeleton"μ μμ±ν΄λ³΄μ.
μ½λλ λ€μκ³Ό κ°λ€.
int main()
{
SpawnerForMonster* spawner = new SpawnerForMonster;
Monster* skeleton = new Monster("Skeleton");
spawner->SetProto(skeleton);
vector<Monster*> vecMonsters(10, nullptr);
for (int i = 0; i < 10; ++i)
{
vecMonsters[i] = spawner->Spawn();
cout << "λͺ¬μ€ν° " << vecMonsters[i]->GetName() << "μ΄ μμ±λμμ΅λλ€." << endl;
}
for (auto& m : vecMonsters)
delete(m);
vecMonsters.clear();
}
μ΅μ’ μΆλ ₯ νλ©΄μ 보면 λͺ¬μ€ν°κ° μ μμ±λ κ²μ νμΈν μ μλ€!!
{ μΈλ¦¬μΌμ λΈλ£¨νλ¦°νΈ ν΄λμ€μ μ λν°μ νλ¦¬νΉ }
μΈλ¦¬μΌμ λΈλ£¨νλ¦°νΈ ν΄λμ€μ μ λν°μ ν리νΉλ μ΄λ° νλ‘ν νμ ν¨ν΄μ μμ©ν λ°©μμ΄λ€.
미리 κ°μ²΄λ₯Ό μ€κ³ν΄λκ³ νμν λλ§λ€ κ°μ²΄λ₯Ό 볡μ¬νμ¬ μ¬μ λ‘λνλ λ°©μμ κ²μ κ°λ°μ μμ΄ κ΅μ₯ν ν¨μ¨μ μ΄λ€.
'π₯οΈ Study Note > Design Patteren' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
κ΄μ°°μ(Observer) ν¨ν΄ (0) | 2023.06.08 |
---|---|
κ²½λ(FlyWeight) ν¨ν΄ (2) | 2023.06.07 |
λͺ λ Ή(Command) ν¨ν΄ (2) | 2023.06.05 |
λμμΈ ν¨ν΄μ΄λ? (0) | 2023.06.05 |