소개 게임 프로그래밍 수업이 끝나고 있으며, 이전에 배운 OOP 경험과 함께 배운 기술을 결합하여 2D 게임을 만들기위한 작은 라이브러리를 만들고 싶습니다. 내 현재 관심사는 내 수업의 사례 모음을 관리하는 가장 좋은 방법입니다.오브젝트 관리 - 컨테이너 또는 공장?
사용중인 라이브러리 (DarkGDK)는 완전히 정수로 작동하는 자유 함수로 구성됩니다. dbSprite()와 같은 함수를 사용하여 "객체"를 만들면이를 참조하는 고유 한 ID (int
값)를 제공합니다. 정렬 유형은 "주소"입니다. 필자는 개인적으로이 접근법이 유용하다는 것을 알기 때문에 Image, Sprite 및 AnimatedSprite와 같은 자유 함수의 각 집합을 캡슐화하기위한 클래스를 만들었습니다 (두 Sprite 유형은 DarkGDK 라이브러리와 다릅니다.)
문제는 in 이러한 객체가 작동하도록하려면 적절한 주소에 대해 DarkGDK 함수를 호출하기 위해 여전히 고유 ID를 생성자에 전달해야합니다. 저는 ID로 모든 것을 함께 언급하는 것으로부터 벗어나려고 노력하고 있습니다.하지만 객체를 어떻게 만들어야하는지에 관해 논쟁 중입니다. 지금은 생성 된 각 객체에 대한 참조를 보유하고있는 일부 AssetManager 클래스가 있으며 기존 ID를 확인하고 고유 한 ID 만 허용하지만 관리 클래스 외부의 ID를 생성해야하는 문제는 여전히 해결되지 않습니다. 이것은 내가 공장이 최선의 접근 방법이 될 것이라고 생각하게했다.
나는 C#에서 인스턴스를 생성하기 위해 각 자산에 대한 적절한 생성자를 쉽게 호출 할 수있는 AssetFactory<T> where T:Asset
을 만들 수 있음을 알고 있지만 C++에는 이러한 기능이 없습니다.
그래서 내가 취해야하는 접근법은 일종의 추상 AssetFactory를 사용하는 것이라고 생각합니다. 내 아이디어 (올바른지 여부)는 AssetFactory의 하위 항목이 사용중인 ID를 추적하고 적절한 개체 ID 만 발급한다는 것입니다. 이런 식으로 뭔가가 :
class Asset {
int m_index;
Asset(int index);
};
class Image : public Asset {
Image(char* imgPath);
void Draw();
};
class Sprite : public Asset {
Sprite(Image* img);
void Draw();
};
class AssetFactory {
private:
std::vector<Asset*> m_assets;
int GetUniqueID();
public:
AssetFactory();
~AssetFactory();
virtual Asset* CreateAsset(); // but each class has different constructor parameters...
};
class ImageFactory : public AssetFactory {
Asset* CreateAsset(char* imgPath); // ...so this wouldn't work (nor compile)
};
class SpriteFactory : public AssetFactory {
Asset* CreateAsset(); // ...so will i be forced to call the default constructor and modify it later?
};
여기서 문제는 위에서 언급 한 바와 같이, 다른 개체가이 디자인 논쟁을, 다른 생성자를 가지고 있다는 것입니다. 다른 접근 방법을 택해야합니까? 아니면 Factory Pattern에 대한 잘못된 생각을 갖고 있습니까?
편집 : 그것은 은 스프라이트에 대한 admissable이고 이미지가 동일한 ID를 가지고 있기 때문에 설명을 위해, 나는 스프라이트와 이미지에 대해 별도의 공장을 원하는 이유는. ID는 동일한 '유형'의 다른 저작물 중에서 유일해야합니다.
나는 왜 이것이 downvoted인지 모르겠다. 그러나 나는 0으로 다시 투표 할 것이다. –
FYI : 정수 메소드는 일반적으로 포인터로 데이터 구조와 인터페이스하지 않고 핸들 (정수)을 사용하기 때문에 일반적으로 핸들이라고합니다. – Daemin
@Daemin : 그것이 제가 찾고 있던 용어입니다. 고맙습니다. C에서 일반적인 관행입니까? 비록 라이브러리가 MVC2008과 함께 출시되었지만, C++ 라이브러리처럼 투영되었습니다. 아키텍처와 동작이 나에게 C와 비슷한 것처럼 보입니다. –