动态创建2

上一篇提到了一种“分散式”型别保存方式,即每个具体产品里面保存了型别信息。类似于MFC的CRuntimeClass。这样做的缺点就是不容易管理,类别分布在各个类中,如果中间某个链接“断裂”,那么有可能导致整个型别网不可用。

 

在Modern C++ Design中提到了一种使用工厂来管理所有类别的解决方案,类别都保存在一个map里,每个具体的产品类向该工厂注册。创建对象时通过调用CreateObject(int iTypeID)就可以得到相应的类别。同前一种比起来,这种方法更容易理解。

 

首先需要一个工厂类,它应该是一个singleton,提供RegisterType,DeregisterType, CreateClassObject这几个调用。用途分别是注册,反注册,创建对象。

 

 

有了工厂,那么每个产品类如何向它注册呢?写在构造函数中显然是不合适的,因为那样每个对象创建时都会调用一次,而且还有一个逻辑上的冲突,我们是想用AnimalFactory创建对象,而在使用之前还却需要定义一个“不是由工厂创建的对象”,类似于theApp的东西。这显然不合适。还有个办法就是定义一个全局初始化函数,每次使用前先调用一下,那么这个构造函数就必须知道所有的产品类,似乎又走到老路上去了,最开始使用动态创建的目的就是避免出现一个“无所不知”的函数,上面两个方法都行不通,因此还要想办法让产品类“自注册”,这也是动态创建的精髓,把工作分散到每个产品类里面去,避免那个“无所不知”的函数出现。

 

如果是自注册,就要求创建任何一个产品对象之前就已经完成注册了。静态成员变量可以满足这个要求。静态成员变量在构造函数被编译成二进制码后,每当系统加载可执行文件或者是dll时就会自动创建它们,而且早于main或者WinMain。

 

因此定义一个AutoRegister类

 

 

每个产品类中都包含一个AutoRegister静态成员变量

 

 

在源文件中定义

 

 

这样就实现了自注册。由此可见static成员变量在实现类的一些注册,信息全局保存具有很重要的作用。

 

有了上面这些就可以使用这个工厂了代码如下:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

阅读更多
个人分类: C/C++
上一篇动态创建1
下一篇modern c++ design系列
想对作者说点什么? 我来说一句

动态创建窗体如何相互通讯2

2013年11月27日 58KB 下载

动态添加datatable

2011年11月07日 595B 下载

动态创建控件的源代码资源

2010年07月01日 61KB 下载

VB 原码 创建数据库 动态创建

2010年05月22日 2KB 下载

在VC 中如何动态创建控件

2008年11月05日 4.15MB 下载

动态创建Table.TR。Td

2010年04月09日 713B 下载

动态创建菜单.rar

2010年07月01日 36KB 下载

没有更多推荐了,返回首页

关闭
关闭