我要設(shè)計的應(yīng)用程序其中的一個模塊就是封裝 windows GDI中的畫筆,畫刷等GDI object
把GDI object 再封裝成resource,以實現(xiàn)多種樣式多線條的畫筆及畫刷資源
畫筆,畫刷等資源繼承resource
為了避免發(fā)生資源泄露和resource的管理
設(shè)計ResourceManager類,負責資源的創(chuàng)建,加載和卸載以及刪除
兩個抽象類 Resource 和 ResourceManager
兩個具體類 ConcreateResource 和 ConcreateResourceManager
分別派生于上面的抽象類
以上設(shè)計是看了 OGRE 游戲引擎的資源管理部分,
對它的資源管理類ResourceManager不是很理解
resource 派生了pen,brush等類
pen類可以來自文件,也可以自己創(chuàng)建SubPen 添加到SubPenList中
ResourceManager 負責創(chuàng)建資源Resource
1. 如果我在抽象的 ResourceManager 聲明 createRes函數(shù),并返回基類resource
勢必會要強制轉(zhuǎn)換,然后在用到具體的Resource時候又要轉(zhuǎn)換回來
2. 如果我在具體類 ConcreateResourceManager 聲明 createConcreateRes函數(shù)
那么就白費了我應(yīng)用設(shè)計模式設(shè)計這么多類
// 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){}
}
?