我要設計的應用程序其中的一個模塊就是封裝 windows GDI中的畫筆,畫刷等GDI object
把GDI object 再封裝成resource,以實現多種樣式多線條的畫筆及畫刷資源
畫筆,畫刷等資源繼承resource
為了避免發生資源泄露和resource的管理
設計ResourceManager類,負責資源的創建,加載和卸載以及刪除
兩個抽象類 Resource 和 ResourceManager
兩個具體類 ConcreateResource 和 ConcreateResourceManager
分別派生于上面的抽象類
以上設計是看了 OGRE 游戲引擎的資源管理部分,
對它的資源管理類ResourceManager不是很理解
resource 派生了pen,brush等類
pen類可以來自文件,也可以自己創建SubPen 添加到SubPenList中
ResourceManager 負責創建資源Resource
1. 如果我在抽象的 ResourceManager 聲明 createRes函數,并返回基類resource
勢必會要強制轉換,然后在用到具體的Resource時候又要轉換回來
2. 如果我在具體類 ConcreateResourceManager 聲明 createConcreateRes函數
那么就白費了我應用設計模式設計這么多類
// abstract class for resource
class Resource{
public:
?// standard constructor
? Resource(const string& name, const string& group)
?:mName(name),mGroup(group){}
? ~Resource(){}
protected:
?// prevent default construct
? Resource():mName(""),mGroup(""){}
? string mName;
? string mGroup;
? static unsigned long mHandle;
};
// subclass of resource
// concreateResource such as PEN
class Pen:
?public Resource{
?Pen(const string& name, const string& group)
??:Resource(name,group){}
??~Pen(){}
? void loadfromFile(string& filename);
// add?into vector
? void addSubPen(SubPen* sub){
???? mSubPenList.push_back(sub);
}
public:
typedef std::vector<SubPen> SubPenList;
SubPenList mSubPenList;
};
class
// abstract class for resource manager
class ResourceManager{
public:
? ResourceManager(){}
? ~ResourceManager(){}
public:
// here , I cannot understand OGRE degsin
? Resource* createRes(const string& name,const string& group);
?// resource map
typedef std::map<string,Resource*> ResourceMap;
?? ResourceMap mResources;
};
// subclass ResourceManager
class ConcreateResourceManager
?:public ResourceManager
{
?ConcreateResourceManager(){}
?~ConcreateResourceManager(){}
????? // how can design here!!
?????? Pen* createPen(const string& name,const string& group){}
}
?