ν”„λ‘œν† νƒ€μž…(ProtoType) νŒ¨ν„΄

2023. 6. 19. 16:55Β·πŸ–₯️ Study Note/Design Patteren

였늘의 κ²°κ³Ό ν™”λ©΄ 미리보기!

{ ν”„λ‘œν† νƒ€μž…μ΄λž€? }

ν”„λ‘œν† νƒ€μž… νŒ¨ν„΄μ΄λž€ 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
'πŸ–₯️ Study Note/Design Patteren' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • κ΄€μ°°μž(Observer) νŒ¨ν„΄
  • κ²½λŸ‰(FlyWeight) νŒ¨ν„΄
  • λͺ…λ Ή(Command) νŒ¨ν„΄
  • λ””μžμΈ νŒ¨ν„΄μ΄λž€?
Beankong_
Beankong_
μ£Όλ‹ˆμ–΄ ν΄λΌμ΄μ–ΈνŠΈ ν”„λ‘œκ·Έλž˜λ¨Έ 곡뢀 기둝
  • Beankong_
    Beankong's Devlog
    Beankong_
  • 전체
    였늘
    μ–΄μ œ
    • 전체 κΈ€ (146)
      • β›… Daily (0)
      • πŸ–₯️ Study Note (2)
        • C++ (1)
        • Unreal Engine (5)
        • Coding Test (123)
        • Design Patteren (5)
        • VCS (Git..) (1)
        • Server (1)
      • 🧭 Devlog (8)
        • μ˜€λ‹΅λ…ΈνŠΈ (4)
        • UE5 GameLift Server Test Project (1)
        • TIL (3)
  • λΈ”λ‘œκ·Έ 메뉴

    • 링크

    • 곡지사항

    • 인기 κΈ€

    • νƒœκ·Έ

      programmers
      κ²Œμž„ ν”„λ‘œκ·Έλž˜λ°
      cpp
      unrealengine module
      ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€
      unrealengine build system
      UnrealEngine5
      OnlineSubsystem
      κ²Œμž„ λͺ¨μž‘
      κ²Œμž„ 개발
      그리디(greedy)
      μ•Œκ³ λ¦¬μ¦˜
      ν”„λ£Œκ·Έλž˜λ¨ΈμŠ€
      μ½”λ”©ν…ŒμŠ€νŠΈ
      propertyaccess
      UnrealEngine
      ν—¬ν…Œμ΄μ»€
      κ²Œμž„ν”„λ‘œκ·Έλž˜λ°
      μ΅œλ‹¨ 거리 μ•Œκ³ λ¦¬μ¦˜
      κ·Έλž˜ν”„ 순회
    • 졜근 λŒ“κΈ€

    • 졜근 κΈ€

    • hELLOΒ· Designed Byμ •μƒμš°.v4.10.3
    Beankong_
    ν”„λ‘œν† νƒ€μž…(ProtoType) νŒ¨ν„΄
    μƒλ‹¨μœΌλ‘œ

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”