관리 메뉴

기억을 위한 기록들

[GPP]프로토타입 패턴 본문

디자인 패턴 ( Design Pattern )/게임프로그래밍 패턴

[GPP]프로토타입 패턴

에드윈H 2023. 2. 2. 21:57

"원형(Prototypical)이 되는 인스턴스를 사용하여 생성할 객체의 종류를 명시하고, 이렇게 만든 견본을 복사해서 새로운 객체를 생성합니다"

 

예를들어서.. 게임에 나오는 몬스터마다(Ghost, Demon, Sorcerer 같은...) 클래스를 만들어본다고 하자.

 

 

 

이제 몬스터롤 스폰하기 위해 Spawner 클래스를 만든다고 치면, 한 가지 스포너한 가지 몬스터 인스턴스만 만든다.

스포너 클래스 상속 구조가 몬스터 클래스 상속구조를 따라가게 된다.

마찬가지로 Demon과 Sorcerer도 스포너를 상속받아 각각의 스포너 클래스를 만들게 된다...

 

 

영 별로다.  클래스도 많지, 행사코드도 많지, 반복 코드도 많지, 중복도 많지,,, 많지 많지...

 

이런 걸 프로토타입 패턴으로 해결할 수 있다.

핵심은 어떤 객체가 자기와 비슷한 객체를 스폰(Spawn)할 수 있다는 점이다..

 

유령 객체 하나로 다른 유령 객체를 여럿 만들 수 있고, 악마 객체로부터도 다른 악마 객체를 만들 수 있다.
어떤 몬스터 객체든지 자신과 비슷한 몬스터 객체를 만드는 원형(Prototypical) 객체로 사용할 수 있다.

이를 구현하기 위해 여기서 상위 클래스인 Monster에 추상 메서드 clone()을 추가해준다.

 

Monster 하위 클래스에서는 자신과 자료형과 상태가 같은 새로운 객체를 반환하도록 clone()을 구현한다.

예로 Ghost로 해보자면

 

 

health와 speed를 임의로 추가 해주었다.

 

Monster를 상속받는 모든 클래스에 clone 메서드가 있다면, 스포너 클래스를 종류별로 만들 필요 없이 하나만 만들면 된다.

 

Spawner 클래스 내부에는 Monster객체가 숨어 있다. 이 객체는 벌집을 떠나지 않는 여왕벌처럼 자기와 같은 Monster객체를 도장 찍듯 만들어내는 스포너 역할만 한다.

이런식으로 스폰하게 된다.

프로토타입 패턴의 좋은 점은 프로토타입의 클래스뿐만 아니라 상태도 같이 복제한다는 점이다.

이제 몬스터마다 스포너 클래스를 따로 만들지 않아도 된다.

얼마나 잘 작동하는가?
Monster 클래스마다 clone()을 구현해야 하기 때문에 코드 양은 별반 차이 없다.
그런데 요즘은 프로토타입 패턴을 써도 코드양이 많이 줄어들지 않고, 사실 위 예저도 현실적이지 않다.
요즘은 개체종류별로 클래스를 만들기보다는 컴포넌트 패턴이나 타입객체로 모델링 하는것을 선호한다.

 

스폰 클래스 대신 스폰 함수

 

몬스터 종류마다 클래스를 만드는 것보다 행사코드가 훨씬 적다.

이제 스포너 클래스에는 함수 포인터 하나만 두면 된다.

 

이제 Ghost를 스폰하는 객체는 이렇게 만들 수 있다.

 

콜백함수를 파라미터로 넣어주고 있다.

템플릿 사용

 

공용 상위 클래스인 Spawner 클래스 없이 SpawnerFor <T>만 있다면 몬스터를 스폰하는 코드에서 매번 템플릿 매개변수를 넣어줘야 한다.

 

사용법

 

 

'디자인 패턴 ( Design Pattern ) > 게임프로그래밍 패턴' 카테고리의 다른 글

[GPP]싱글턴  (0) 2023.02.02
[GPP]상태 패턴  (0) 2023.02.02
[GPP]컴포넌트 패턴  (0) 2023.02.02
[GPP]경량 패턴  (0) 2023.01.29