Prototype Pattern이란?
- 어떤 객체가 자기와 비슷한 객체를 스폰 할 수 있도록 하는 패턴
예제
몬스터 스포너
public class Monster{
}
public class Ghost : Monster{}
public class Demon : Monster{}
public class Sorcerer : Monster{}
public class Spawner{
public virtual Monster SpawnMonster(){}
}
public class GhostSpawner : Spawner{}
public class DemonSpawner : Spawner{}
- 애초에 요즘은 몬스터를 각기 다른 클래스로 만들지도 않지만, 각각의 몬스터에 따라 스포너를 만들어줘야하는 문제가 생긴다.Monster에 추상 매서드 Clone 추가
public abstract class Monster{ public abstract Monster Clone() } public class Ghost : Monster{ public override Monster Clone(){ return new Ghost(_health,_speed); } }
public class Spawner{
private Monster _prototype;
public Monster SpawnMonster(){
return _prototype.Clone();
}
}
- 깔끔하다! 하지만 이렇게되면 매번 Clone()함수를 만들어줘야한다. 이를 해결해 보자.
1. 스폰 함수를 사용하는 법
```CSharp
public class Spawner{
private Func<Monster> _spawn;
public Monster SpawnMonster(){
return _spawn?.Invoke();
}
public Spanwer(Func<Monster> spanFunc){
_spawn = spanFunc;
}
}
// 사용시
Spawner ghostSpanwer = new Spawner(()=>{return new Ghost()})
ghostSpawner.SpawnMonster();
- 템플릿을 사용하는 법
public class Spawner{ public Monster Spawn<T>() where T : Monster { return new T(); } }
'CS > DesignPattern' 카테고리의 다른 글
[DesignPattern] 타입객체 (0) | 2024.10.23 |
---|---|
[DesignPattern] 이중버퍼 (0) | 2024.10.21 |
[DesignPattern] 경량 패턴 (0) | 2024.10.14 |
[DesignPattern] 커맨드 패턴 (0) | 2024.10.14 |
[DesignPattern] 옵저버 패턴 (0) | 2024.10.14 |