我要设计的应用程序其中的一个模块就是封装 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){}
}