动态创建2

原创 2011年01月10日 18:12:00

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

 

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

 

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

 

 

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

 

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

 

因此定义一个AutoRegister类

 

 

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

 

 

在源文件中定义

 

 

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

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

  • 2013年11月27日 21:32
  • 58KB
  • 下载

MFC框架仿真---(2)动态创建

动态创建本质:return new class_name;在mfc.h中的如下位置:/*********************************************************...
  • W__L__
  • W__L__
  • 2017年06月24日 18:40
  • 153

C++编程思想--动态创建对象(2)

动态创建对象(2)   5)重载new 与delete,首先为什么需要重载new与delete呢? ① 也许要创建和销毁一个类的非常多的对象,以至于这个影响到了速度。 ② 分配不同大小的内存...

ZendFramework2学习笔记 动态创建表和日志

ZendFramework2框架提供了Z

添加Ipanel 中间件中2D效果时,里面动态创建的内容不显示的解决办法

原始html ,其中多添加的属性为visibility:hidden,

《JBPM流程通过Aciton动态创建TaskInstance来实现“会签”》2

前面写过一篇文章《JBPM流程通过Aciton动态创建TaskInstance来实现“会签”》,不过那篇文章可以说是一个大体思路的简单实现,并不完整,也有不少朋友提出了不少的问题。因为做事要善始善终,...

3.2.2 工具栏上动态创建控件combobox

p120,单文档 // MainFrm.h : interface of the CMainFrame class // ////////////////////////////////////...

黑马程序员_学习日记60_706Dom2(事件冒泡、this、动态创建Dom、innerHTML、动态设置样式)

一、 事件冒泡 (一) window.event.cancelBubble 取消事件冒泡 aaaa ...

面向对象动态创建表格(php)

  • 2017年05月24日 01:41
  • 391KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:动态创建2
举报原因:
原因补充:

(最多只允许输入30个字)