Beginning to 编程

VC++ 方面编程文章

 

资源和资源管理类的设计问题


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

 

posted on 2006-05-27 22:19 Beginning to 编程 阅读(688) 评论(1)  编辑 收藏 引用 所属分类: 程序摘录

评论

# re: 资源和资源管理类的设计问题 2006-05-28 11:05 LOGOS

我不太清楚你要干什么。。。
class Pen : public Resource;
class PenManager : public ResourceManager;
class Brush : public Resource;
class BrushManager : public ResourceManager;

ResourcePtr ResourceManager::create(...) 只是创建一个占位符,但是还没有load。
设计基类Resource的目的,是为了可以重用ResourceManager对资源的管理代码,不是给你用的。
至于对具体资源的引用和载入,是留给具体的ResourceManager来实现的。因此你要创建Pen,应该这么做:PenPtr p = PenManager::singleton().load(...)。而不是:PenPtr p = (PenPtr)ResourceManager::singleton().create(...)。  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


导航

统计

常用链接

留言簿(4)

随笔分类

随笔档案

文章档案

相册

BlogDev

搜索

最新评论

阅读排行榜

评论排行榜