我即將結束一個入門遊戲編程課程,希望將我在課堂上學到的技能與以前的OOP體驗相結合,創建一個用於製作2D遊戲的小型圖書館。然而,我目前的擔心是管理我的類的實例集合的最佳方式。對象管理 - 容器還是工廠?
我正在使用的庫(DarkGDK)完全由作用於整數的自由函數組成。當使用諸如dbSprite()之類的函數創建「對象」時,我們給它一個唯一的ID(int
值)以引用它 - 一個「地址」排序。我個人發現這種方法很簡單,所以我創建了一些類來封裝每一組自由函數,如Image,Sprite和AnimatedSprite(這兩個Sprite類型在DarkGDK庫中是不同的)。
問題是,爲了使這些對象工作,我仍然需要傳遞一個唯一的ID給構造函數,以便根據適當的地址調用DarkGDK函數。我試圖擺脫由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?
};
這裏的問題是,正如上面提到的,不同的對象有不同的構造,使得這樣的設計毫無意義。我應該採取不同的方法嗎?或者我只是對工廠模式有錯誤的想法?
編輯:爲了澄清,我要爲精靈和圖片不同的工廠的原因是因爲它是 admissable了雪碧和圖像具有相同的ID。 ID必須在同一「類型」的其他資產中唯一。
我不知道爲什麼這是downvoted,但我投它回零。 –
僅供參考:整數方法通常稱爲Handle,因爲您不是直接通過指針與數據結構進行交互,而是通過指針的句柄(整數)與數據結構進行交互。 – Daemin
@Daemin:這是我一直在尋找的術語。謝謝。這是C中的常見做法嗎?儘管該庫是在MVC2008版本中發佈的,但它仍然是一個C++庫,儘管它的架構和行爲對我來說似乎非常類似C。 –