2013-04-27 1 views
2

타워 방어 게임을 만들고 있습니다. 레벨이 생성되기 전에 나는 몬스터, 탑 등에 관한 통계를 메모리에 준비 할 필요가 있습니다. 예를 들면 다음과 같습니다.많은 클래스의 데이터 초기화를 보장하는 디자인 패턴

fastmonster.name = "Rabbit"; 
fastmonster.health = 100; 
fastmonster.speed = 10; 
slowmonster.name = "Turtle"; 
slowmonster.health = 500; 
slowmonster.speed = 2; 

탑과 다른 물건에 대해서도 마찬가지입니다.

(I이 상세히 파일에서 읽을 수 방법을 결정하지 않았습니다.)

어떻게이 모든 데이터가 생성되는 몬스터 또는 탑 클래스의 객체하기 전에 준비가되어 있음을 확인합니까? 전 모든 데이터를 한 번 전역 적으로 초기화하고 일반 생성자로 몬스터 객체를 만들 수있는 디자인 패턴을 찾고 있습니다. 동시에 단위 통계가 읽히기 전에 어떤 객체도 생성되지 않도록해야합니다.

나는이 문제가 백만 번 해결되었지만 지금까지이 문제에 실제로 부합하는 해결책을 찾지 못했고 몇 가지 추상적 수준을 가진 수퍼 콤플렉스가 아니라고 확신합니다.

내 솔루션은 지금까지

나는 생성자는 비공개과 문제는 내가 타워에 대한 동일한 기능을 만들어야한다는 지금이

Monster Monster::create (MonsterType type) { 
    if (!initialized()) { 
     initialize(); 
     initialized = true; 
    } 
    return new Monster(type); 
} 

처럼 보이는 create() 기능을 정의 및 기타 모든 게임 요소. 이것은 많은 중복처럼 보입니다.

또 다른 내가 모든 생성자는 개인 유지

생각했다. (싱글 톤?) 팩토리 클래스를 만들어 모든 클래스의 친구로 만들고 모든 객체를 만들도록하십시오. 팩토리는 생성 될 때 초기화를 수행합니다.

GOF 패턴

나는 다른 창조적 패턴을 보였지만, 그들 중 누구도 맞게 보이지 않는다. 아니면 그냥 충분히 이해하지 못했습니다.

+0

언어는 C++입니다. 그렇습니까? –

+0

예, Qt가있는 C++입니다. 하지만 솔루션을 언어에 구애받지 않는다고 가정 할 때 의도적으로 버려졌습니다. – problemofficer

+0

필자는 공장을 방문하여 데이터 생성을 통해 일반화하고 (소개하는 각 클래스에 대한 특정 코드를 작성하지 않도록) 작성했습니다. – asermax

답변

0

귀하의 솔루션이 훌륭하다고 생각합니다.

중복을 피하기 위해 템플릿 방법 GOF 패턴을 사용하여 향상시킬 수 있습니다.

불행히도 나는 C의 ++에서 구현하는 방법을 모른다,하지만 C#에서 그것은 다음과 같을 수 있습니다

public abstract class BaseEntity<T> 
{ 
    private bool initialized = false; 

    public BaseEntity<T> Create(T typeOfEntity) 
    { 
     if (!Initialized()) 
     { 
      Initialize(); 
      initialized = true; 
     } 

     return GetEntity(typeOfEntity); 
    } 

    protected abstract void Initialize(); 
    protected abstract bool Initialized(); 
    protected abstract BaseEntity<T> GetEntity(T typeOfEntity); 
} 

public class MonsterEntity:BaseEntity<MonsterType> 
{ 
    //... 

    public MonsterEntity(MonsterType typeOfEntity) 
    { 
     //... 
    } 

    protected override void Initialize() 
    { 
     //initialize logic 
    } 

    protected override bool Initialized() 
    { 
     bool initialized = false; 

     //check for initialization 

     return initialized; 
    } 

    protected override BaseEntity<MonsterType> GetEntity(MonsterType typeOfEntity) 
    { 
     return new MonsterEntity(typeOfEntity); 
    } 

    //... 
} 

은 또한 당신이 당신의 entites에 대한 서브 클래스를 추가하고 GetEntity 패브릭 방법 방법을 만들 수 있습니다.

관련 문제