ProtoType 패턴

ProtoType 패턴


정의


  • 객체를 생성할 때, 원본 객체를 복사해서 생성하는 패턴
  • 클래스에 멤버함수로 Clone을 만들어둔다.


상황


  • 던전앤파이터의 넨마스터의 스킬중 '분신'은 말그대로 캐릭터의 분신을 만든다. 캐릭터의 스킬 레벨에따라서 일정 %만큼의 HP를 가진 복수개의 분신을 생성한다.


    파일:PvWtDRa.png

  • 즉, 플레이어 캐릭터보다 단순화된 능력치의 캐릭터 복제가 이루어져야하는데, 캐릭터를 일일히 생성하는 것보다 원본 캐릭터를 복제하고 능력치를 조정하는 것이 더 쉬울 것같다.


코드


#include <iostream>


class Character

{

public:

Character() {}

Character(int hp, int mp):HP(hp), MP(mp), XPos(100), YPos(100) { }


virtual Character* Clone() = 0;


void SetPos(int xpos, int ypos)

{

XPos = xpos; YPos = ypos;

}


void SetState(float percent) 

{

HP *= percent; MP *= percent;

}


protected:

int HP, MP;

int XPos, YPos;

};


class NenMaster :public Character

{

public:


NenMaster(int hp, int mp) :Character(hp,mp) { bunsinLev = 1; }

NenMaster(NenMaster& rhs) { *this = rhs; }



Character* Clone()

{

return new NenMaster(*this);

}


Character* Bunsinsul()

{

Character** bunsin = new Character*[bunsinLev];


for(int i = 0 ; i < bunsinLev ; i++)

{

bunsin[i] = this->Clone();

bunsin[i]->SetState(0.1 * bunsinLev);

//분신 위치 조정 코드“œ

}


std::cout << "분신 생성" << std::endl;


return *bunsin;

}


private:

int bunsinLev;

};


int main()

{

NenMaster* nm = new NenMaster(100,100);

Character* bunsin = NULL;


bunsin = nm->Bunsinsul();


delete nm;

delete[] bunsin;


return 0;

}



장점


  •  원본 객체를 바탕으로 새로운 객체를 만들 때, 기존 클래스로부터 상태 값을 변경하는 것으로 쉽게 만들 수 있다.
  • (GOF책) Abstract Factory 패턴은 객체를 생성해주기 위한 클래스를 정의/생성해야하지만, ProtoType패턴은 Clone 함수로 생성하기에 별도의 클래스 정의가 필요하지 않다.



단점


  • 단점이라기보단 주의사항인데, 복사생성자를 사용하니 깊은 복사와 얕은 복사를 유의해서 사용해야한다.



---------------------------------------------------------------------------------------------------------------------------------------------------


뭔가 또 예시를 잘못들었다.

적절한 예시라고 생각했는데, 막상 코드로 짜면 패턴의 용도를 소개에서 벗어나버리게 되는 느낌이란 말이야..ㅠㅠ....

'프로그래밍 > 프로그래밍 관련' 카테고리의 다른 글

Command 패턴 (1)  (0) 2018.01.17
Singleton 패턴  (0) 2016.10.22
Abstract Factory 패턴  (0) 2016.10.15
Cookie, Session 그대의 의미는..  (0) 2015.10.29
URL과 URI 차이점  (0) 2015.10.27
더보기

댓글,

Lowpoly

게임 서버 프로그래머 지망생