动态创建2

来源:互联网 发布:win8未激活网络怎么办 编辑:程序博客网 时间:2024/05/21 23:09

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

 

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

 

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

 

 

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

 

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

 

因此定义一个AutoRegister类

 

 

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

 

 

在源文件中定义

 

 

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

 

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