CN108897532B - 一种类工厂注册的方法、装置及电子设备 - Google Patents
一种类工厂注册的方法、装置及电子设备 Download PDFInfo
- Publication number
- CN108897532B CN108897532B CN201810327920.2A CN201810327920A CN108897532B CN 108897532 B CN108897532 B CN 108897532B CN 201810327920 A CN201810327920 A CN 201810327920A CN 108897532 B CN108897532 B CN 108897532B
- Authority
- CN
- China
- Prior art keywords
- class
- program area
- creating
- factory
- program
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
- G06F8/315—Object-oriented languages
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computing Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明实施例公开了一种类工厂注册的方法、装置及电子设备。本发明实施例方法包括:在源代码中创建自定义程序段,并在该自定义程序段中创建第一程序区、第二程序区和第三程序区,该第一程序区中创建的全局数据的地址在第二程序区的之前,第二程序区中创建的全局数据的地址在第三程序区的之前;在第一程序区创建列表头指针,在第三程序区创建列表尾指针;在第二程序区注册预设的类工厂。本发明通过对传统的类工厂模式中利用一个全局变量进行类工厂注册时,只能将所有的类注册代码写在一个代码文件中存在的不灵活性加以改进,利用程序段和程序区的特性自动注册类工厂,可以在项目任意的源文件中对类工厂进行注册,极大提高了类工厂模式的灵活性。
Description
技术领域
本发明涉及计算机技术领域,特别涉及一种类工厂注册的方法、装置及电子设备。
背景技术
在大型的软件项目中,经常会用到各种各样的设计模式来保证整个项目系统的稳定性,源代码可读性,后期易于维护性等要求。其中类工厂模式就是这些设计模式中常使用的一点,类工厂模式的优点就在于可以更为方便灵活的创建类对象。
类工厂模式实现的核心就在于将所有的类,注册到一个全局的地址中,通过该全局的地址可以枚举到所有要创建的类。传统方案的实现中,主要是将类一个一个的添加到一个全局变量中,然后通过遍历该全局变量中的所有项,就可以找到要创建的类。
传统方案的优点在于实现比较简单,其缺点在于代码的耦合性比较高,需要在一个独立的代码文件中注册整个系统中所有要用到的类,这样的话,限制就非常大,不能在代码的任意位置中灵活的将类进行注册。
发明内容
本发明实施例提供了一种类工厂注册的方法、装置及电子设备,以解决目前类工厂注册限制非常大,不能在代码的任意位置中灵活的将类进行注册的问题。
第一方面,本申请提供了类工厂注册的方法,该方法包括:
在源代码中创建自定义程序段,并在所述自定义程序段中创建第一程序区、第二程序区和第三程序区,其中,所述第一程序区中创建的全局数据的地址在所述第二程序区的之前,所述第二程序区中创建的全局数据的地址在所述第三程序区的之前;
在所述第一程序区创建列表头指针,在第三程序区创建列表尾指针;
在所述第二程序区注册预设的类工厂。
进一步的,所述预设的类工厂包括至少两种类型类工厂;所述至少两种类型类工厂为所述源代码对应的目标软件项目中需要使用的类工厂。
进一步的,所述在所述第二程序区注册预设的类工厂,包括:
分别在所述第二程序区注册所述至少两种类型类工厂。
进一步的,所述方法还包括:
在所述第二程序区注册预设的类工厂之前,预先创建一个类工厂注册宏;
所述在所述第二程序区注册预设的类工厂,包括:
利用所述类工厂注册宏在所述第二程序区注册所述至少两种类型类工厂。
进一步的,所述方法还包括:
创建一个用于根据类名称来创建类对象的CreateObject函数,所述CreateObject函数的实现逻辑为在所述列表头指针和所述列表尾指针之间根据类名称找到相应的ClassFactoryEntry全局结构体数组,并调用所述ClassFactoryEntry全局结构体数组中的creator回调函数创建类对象。
第二方面,本申请提供一种类工厂注册的装置,该装置包括:
第一创建模块,用于在源代码中创建自定义程序段,并在所述自定义程序段中创建第一程序区、第二程序区和第三程序区,其中,所述第一程序区中创建的全局数据的地址在所述第二程序区的之前,所述第二程序区中创建的全局数据的地址在所述第三程序区的之前;
第二创建模块,用于在所述第一程序区创建列表头指针,在第三程序区创建列表尾指针;
注册模块,用于在所述第二程序区注册预设的类工厂。
进一步的,所述预设的类工厂包括至少两种类型类工厂;所述至少两种类型类工厂为所述源代码对应的目标软件项目中需要使用的类工厂。
进一步的,所述注册模块具体用于:
分别在所述第二程序区注册所述至少两种类型类工厂。
进一步的,所述装置还包括:
第三创建模块,用于在所述第二程序区注册预设的类工厂之前,预先创建一个类工厂注册宏。
所述注册模块具体用于:
利用所述类工厂注册宏在所述第二程序区注册所述至少两种类型类工厂。
进一步的,所述装置还包括:
第四创建模块,用于创建一个用于根据类名称来创建类对象的CreateObject函数,所述CreateObject函数的实现逻辑为在所述列表头指针和所述列表尾指针之间根据类名称找到相应的ClassFactoryEntry全局结构体数组,并调用所述ClassFactoryEntry全局结构体数组中的creator回调函数创建类对象。
第三方面,本发明还提供一种电子设备,包括:存储器,处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,其中,所述处理器执行所述计算机程序时可以实现第一方面中任一所述的方法。
第四方面,本发明还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现第一方面中任一所述的方法。
本发明实施例通过在源代码中创建自定义程序段,并在该自定义程序段中创建第一程序区、第二程序区和第三程序区,该第一程序区中创建的全局数据的地址在第二程序区的之前,第二程序区中创建的全局数据的地址在第三程序区的之前;在第一程序区创建列表头指针,在第三程序区创建列表尾指针;在第二程序区注册预设的类工厂。本发明实施例中通过对传统的类工厂模式中利用一个全局变量进行类工厂注册时,只能将所有的类注册代码写在一个代码文件中存在的不灵活性加以改进,利用程序段和程序区的特性自动注册类工厂,可以在软件项目任意的源文件中对类工厂进行注册,极大提高了类工厂模式的灵活性。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对本发明实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例中类工厂注册的方法的一个实施例示意图;
图2是本发明实施例类工厂注册的方法的另一个实施例示意图;
图3是本发明实施例类工厂注册的方法的另一个实施例示意图;
图4是本发明实施例中类工厂注册的装置的一个实施例示意图;
图5是本发明实施例中类工厂注册的装置的另一个实施例示意图;
图6是本发明实施例中类工厂注册的装置的另一个实施例示意图;
图7是本发明实施例中电子设备的一个实施例示意图。
本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
下面首先介绍本发明实施例中涉及的一些名词概念。
Class Factory(类工厂):一个实现了IClassFactory接口的类,这允许它创建特定类的对象,也被称为COM Class Object。类工厂的作用是在COM中,客户程序必须通过类工厂(Class Factory)来完成创建COM对象的任务。
段(Segment):我们知道C++编译器编译出来后的二进制文件中有不同的段,不同的段中有不同的功能,例如有代码段,在代码段中保存的是所有的二进制代码;有数据段,在数据段中保存的是所有的全局数据
区(Section):在段(Segment)中,还可以划分为不同的区,并且编译器在最终生成可执行文件时,将相同段中的所有区按照区的名字先后顺序进行合并。比如下面描述的内容中的程序段中有三个不同的a,m,z区,那么在a区中创建的全局数据的地址就会在m区的之前,而在m区中创建的全局数据的地址就会在z区的之前。
目前,假设在一个软件项目中需要使用下面的Math类,Print类,Graphic类,System类那么就有下面的至少两种进行对象创建的方法:
(1)不使用类工厂的情况
在该种情况下,要创建Math类的对象时,直接调用new Math就可以创建一个Math类对象;要创建Print类的对象时,直接调用new Print就可以创建一个Print类对象,以此类推。该种方案在小型的软件项目中比较常用,但是不适合在大型的软件项目中使用。
(2)使用传统类工厂的情况
在使用传统类工厂的情况下,需要有一个全局的对象类保存类注册的方法。假设上述中的4个类中,每一个类都有一个createObject的静态方法,并且有一个类型为ClassFactoryEntry的全局结构体数组g_classFactory来注册上述中的所有类,其中ClassFactoryEntry中有一个字符串类型的className字段,用来保存类的名称;以及一个creator字段,用来保存上述每个类中相信的createObject静态方法的地址。这样注册上述所有类的代码可以用下面的代码加以表示:
g_classFactory[0]={“Math”,Math::createObject}
g_classFactory[1]={“Print”,Print::createObject}
g_classFactory[2]={“Graphic”,Graphic::createObject}
g_classFactory[3]={“System”,System::createObject}
g_classFactory[4]={“”,0}
其中的最后一项表示结尾标记。那么g_classFactory全局数组中就保存了所有的类创建方法,并且我们提供一个CreateObject函数,利用该函数来创建相应的类对象。该函数根据传入的要创建的类名称,从g_classFactory中找到相应的ClassFactoryEntry项,然后调用该结构中的creator回调函数,创建类对象。那么利用上述中的CreateObject方法,创建Math类对象就可以这样调用:
Math*math=0;
CreateObject(“Math”,&math);
创建Print类对象可以这样调用:
Print*print=0;
CreateObject(“Print”,&print);
通过上述中的思路,便模拟出了传统的类工厂注册,并通过类工厂创建对象的主要过程,该注册方法的优点在于实现比较简单,易于理解,但其缺点就在于需要将上述注册的过程必须放在一个源代码文件中,不能在任意的文件中进行注册(主要是C++的语法限制从而不能在任意的代码文件中注册)。
本发明实施例中利用了段,区的特性,实现自动注册类工厂的方法,下面详细进行描述。
本发明实施例中类工厂注册的方法应用于类工厂注册的装置,该装置位于电子设备中,该电子设备可以是手机、平板电脑、个人电脑或服务器等,也可以是未来出现的电子设备等。
请参阅图1,本发明实施例中类工厂注册的方法的一个实施例包括:
S101、在源代码中创建自定义程序段,并在自定义程序段中创建第一程序区、第二程序区和第三程序区;
其中,所述第一程序区中创建的全局数据的地址在所述第二程序区的之前,所述第二程序区中创建的全局数据的地址在所述第三程序区的之前;例如,本发明实施例SIU段中有三个不同的a,m,z区,那么在a区中创建的全局数据的地址就会在m区的之前,而在m区中创建的全局数据的地址就会在z区的之前。本实施例中,程序段为上述描述的段(Segment),第一程序区、第二程序区和第三程序区为上述描述的区(Section)。
S102、在第一程序区创建列表头指针,在第三程序区创建列表尾指针;
本实施例中,列表头指针指的是类工厂列表头指针,列表尾指针指的是类工厂列表尾指针。
S103、在所述第二程序区注册预设的类工厂。
本发明实施例通过在源代码中创建自定义程序段,并在该自定义程序段中创建第一程序区、第二程序区和第三程序区,该第一程序区中创建的全局数据的地址在第二程序区的之前,第二程序区中创建的全局数据的地址在第三程序区的之前;在第一程序区创建列表头指针,在第三程序区创建列表尾指针;在第二程序区注册预设的类工厂。本发明实施例中通过对传统的类工厂模式中利用一个全局变量进行类工厂注册时,只能将所有的类注册代码写在一个代码文件中存在的不灵活性加以改进,利用程序段和程序区的特性自动注册类工厂,可以在软件项目任意的源文件中对类工厂进行注册,极大提高了类工厂模式的灵活性。
本发明实施例中,在源代码中创建自定义程序段,并在自定义程序段中创建第一程序区、第二程序区和第三程序区具体实现方式可以如下:
#pragma section("SIU$__a",read)
通过上面的代码创建一个SIU段(即程序段),并且在该段中创建一个名称为__a的区,__a区即为第一程序区;
#pragma section("SIU$__m",read)
通过上面代码在SIU段中,创建一个名称为__m的区,__m区即为第二程序区;
#pragma section("SIU$__z",read)
通过上面代码在SIU段中,创建一个名称为__z的区,__z区即为第三程序区。
此时,在第一程序区创建列表头指针,在第三程序区创建列表尾指针具体实现方式可以如下:
在__a区中创建一个g_siu_start的ClassFactoryEntry指针,并且在__z区中创建一个g_siu_end的ClassFactoryEntry指针,这样便可以在g_siu_start和g_siu_end之间,找到所有注册的类工厂。
进一步的,所述预设的类工厂包括至少两种类型类工厂;所述至少两种类型类工厂为所述源代码对应的目标软件项目中需要使用的类工厂,例如Math类工厂,Print类工厂,Graphic类工厂,System类工厂等。
上面步骤S102中第一程序区创建列表头指针,在第三程序区创建列表尾指针,即将类工厂列表头部指针放在了g_siu_start中,把类工厂指针的尾部指针放在了g_siu_end中,而后面步骤中就需要把Math类工厂,Print类工厂,Graphic类工厂,System类工厂注册到这两个指针之间的区域中。因为g_siu_start在__a区中,g_siu_end在__z中,而上述步骤中还创建了一个__m的区,所以把上述的4个类工厂注册到__m区中即可。本发明实施例中注册类工厂有两种方式,一种是分别注册这多个类工厂,另一种方式提供一个统一的类工厂注册宏进行注册。
在第一种类工厂注册方式中,如图2所示,所述在所述第二程序区注册预设的类工厂,包括:
S103’、分别在所述第二程序区注册所述至少两种类型类工厂。
根据操作系统的不同,注册方式具体如下:
(1)Windows系统下
注册Math类工厂:
__declspec(allocate(“SIU$__m”))ClassFactoryEntry*g_siu_Math=&{“Math”,Math::createObject}
注册Print类工厂:
__declspec(allocate(“SIU$__m”))ClassFactoryEntry*g_siu_Print=&{“Print”,Print::createObject}
后面的类以此类推,其中的__declspec(allocate(“SIU$__m”))表述将变量分配到SIU$__m区中。
(2)Linux系统下
注册Math类工厂:
__attribute__((section(“SIU$__m”)))ClassFactoryEntry*g_siu_Math=&{“Math”,Math::createObject}
(3)Mac OSX系统下
注册Math类工厂:
__attribute__((section(“__DATA,SIU$__m”)))ClassFactoryEntry*g_siu_Math=&{“Math”,Math::createObject}
在第二种类工厂注册方式中,考虑到上述代码的实现相似性,我们对其进行优化,提供一个统一的类工厂注册宏,如图3所示,本发明实施例中类工厂注册方法还包括:
S104、在所述第二程序区注册预设的类工厂之前,预先创建一个类工厂注册宏;
具体实现方式如下:
(1)Windows系统下
#define CLASS_FACTORY_ENTRY_AUTO(Class)\
ClassFactoryEntry g_##Class={#Class,Class::createObject};\
__declspec(allocate(“SIU$__m”))ClassFactoryEntry*g_siu_##Class=&g_##Class
(2)Linux系统下
#define CLASS_FACTORY_ENTRY_AUTO(Class)\
ClassFactoryEntry g_##Class={#Class,Class::createObject};\
__attribute__((section(“SIU$__m”)))ClassFactoryEntry*g_siu_##Class=&g_##Class
(3)Mac OSX系统下
#define CLASS_FACTORY_ENTRY_AUTO(Class)\
ClassFactoryEntry g_##Class={#Class,Class::createObject};\
__attribute__((section(“__DATA,SIU$__m”)))ClassFactoryEntry*g_siu_##Class=&g_##Class
其中,g_##Class中的##符号在宏中表示字符连接符,例如Class是Math时,就是g_Math;Class是Print时,就是g_Print。
此时,所述在所述第二程序区注册预设的类工厂,包括:
S103”、利用所述类工厂注册宏在所述第二程序区注册所述至少两种类型类工厂。
具体实现方式如下:
在类Math的文件中注册Math类工厂
CLASS_FACTORY_ENTRY_AUTO(Math)
在类Print的文件中注册Print类工厂
CLASS_FACTORY_ENTRY_AUTO(Print)
在类Graphic的文件中注册Graphic类工厂
CLASS_FACTROY_ENTRY_AUTO(Graphic)
在类System的文件中注册System类工厂
CLASS_FACTORY_ENTRY_AUTO(System)
进一步的,为了兼容现有的类工厂注册方式,本发明实施例中方法还包括:
创建一个用于根据类名称来创建类对象的CreateObject函数,所述CreateObject函数的实现逻辑为在所述列表头指针和所述列表尾指针之间根据类名称找到相应的ClassFactoryEntry全局结构体数组,并调用所述ClassFactoryEntry全局结构体数组中的creator回调函数创建类对象。
下面介绍本发明实施例中类工厂注册的装置的实施例。
请参阅图4,为本发明实施例中类工厂注册的装置的一个实施例,该装置包括:
第一创建模块401,用于在源代码中创建自定义程序段,并在所述自定义程序段中创建第一程序区、第二程序区和第三程序区,其中,所述第一程序区中创建的全局数据的地址在所述第二程序区的之前,所述第二程序区中创建的全局数据的地址在所述第三程序区的之前;
第二创建模块402,用于在所述第一程序区创建列表头指针,在第三程序区创建列表尾指针;
注册模块403,用于在所述第二程序区注册预设的类工厂。
进一步的,所述预设的类工厂包括至少两种类型类工厂;所述至少两种类型类工厂为所述源代码对应的目标软件项目中需要使用的类工厂。
进一步的,所述注册模块403具体用于:
分别在所述第二程序区注册所述至少两种类型类工厂。
进一步的,如图5所示,所述装置还包括:
第三创建模块404,用于在所述第二程序区注册预设的类工厂之前,预先创建一个类工厂注册宏。
所述注册模块403具体用于:
利用所述类工厂注册宏在所述第二程序区注册所述至少两种类型类工厂。
进一步的,如图6所示,所述装置还包括:
第四创建模块405,用于创建一个用于根据类名称来创建类对象的CreateObject函数,所述CreateObject函数的实现逻辑为在所述列表头指针和所述列表尾指针之间根据类名称找到相应的ClassFactoryEntry全局结构体数组,并调用所述ClassFactoryEntry全局结构体数组中的creator回调函数创建类对象。
本发明实施例中还提供一种电子设备,请参见图7,所述电子设备包括:
存储器701,处理器702及存储在所述存储器上并可在所述处理器上运行的计算机程序703,其中,所述处理器702执行所述计算机程序703时可以实现上述类工厂注册的方法。
为了便于说明,仅示出了与本发明实施例相关的部分,具体技术细节未揭示的,请参照本发明实施例方法部分。存储器701可用于存储计算机程序703,上述计算机程序包括软件程序、模块和数据,处理器702通过运行执行存储在存储器701的计算机程序703,从而执行电子设备的各种功能应用以及数据处理。
在具体的实施过程中,存储器701可用于存储软件程序以及模块,处理器702通过运行存储在存储器701的软件程序以及模块,从而执行电子设备的各种功能应用以及数据处理。存储器701可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(例如游戏类应用程序、聊天类应用程序)等;存储数据区可存储根据电子设备的使用所创建的数据(游戏配置数据、音频数据)等。此外,存储器701可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。处理器702是电子设备的控制中心,利用各种接口和线路连接整个电子设备的各个部分,通过运行或执行存储在存储器701内的软件程序和/或模块,以及调用存储在存储器701内的数据,执行电子设备的各种功能和处理数据,从而对电子设备进行整体监控。可选的,处理器702可包括一个或多个处理单元;优选的,处理器702可集成应用处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等。
本发明实施例还提供一种计算机可读存储介质,其中,该计算机可读存储介质可存储有程序,该程序执行时包括上述方法实施例中记载的类工厂注册的方法的部分或全部步骤。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
Claims (9)
1.一种类工厂注册的方法,其特征在于,所述方法包括:
在源代码中创建自定义程序段,并在所述自定义程序段中创建第一程序区、第二程序区和第三程序区,其中,所述第一程序区中创建的全局数据的地址在所述第二程序区的之前,所述第二程序区中创建的全局数据的地址在所述第三程序区的之前;
在所述第一程序区创建列表头指针,在所述第三程序区创建列表尾指针;
在所述第二程序区注册预设的类工厂;
创建一个用于根据类名称来创建类对象的CreateObject函数,所述CreateObject函数的实现逻辑为在所述列表头指针和所述列表尾指针之间根据类名称找到相应的ClassFactoryEntry全局结构体数组,并调用所述ClassFactoryEntry全局结构体数组中的creator回调函数创建类对象。
2.根据权利要求1所述的方法,其特征在于,所述预设的类工厂包括至少两种类型类工厂;所述至少两种类型类工厂为所述源代码对应的目标软件项目中需要使用的类工厂。
3.根据权利要求2所述的方法,其特征在于,所述在所述第二程序区注册预设的类工厂,包括:
分别在所述第二程序区注册所述至少两种类型类工厂。
4.根据权利要求2所述的方法,其特征在于,所述方法还包括:
在所述第二程序区注册预设的类工厂之前,预先创建一个类工厂注册宏;
所述在所述第二程序区注册预设的类工厂,包括:
利用所述类工厂注册宏在所述第二程序区注册所述至少两种类型类工厂。
5.一种类工厂注册的方法装置,其特征在于,所述装置包括:
第一创建模块,用于在源代码中创建自定义程序段,并在所述自定义程序段中创建第一程序区、第二程序区和第三程序区,其中,所述第一程序区中创建的全局数据的地址在所述第二程序区的之前,所述第二程序区中创建的全局数据的地址在所述第三程序区的之前;
第二创建模块,用于在所述第一程序区创建列表头指针,在所述第三程序区创建列表尾指针;
注册模块,用于在所述第二程序区注册预设的类工厂;
还用于创建一个用于根据类名称来创建类对象的CreateObject函数,所述CreateObject函数的实现逻辑为在所述列表头指针和所述列表尾指针之间根据类名称找到相应的ClassFactoryEntry全局结构体数组,并调用所述ClassFactoryEntry全局结构体数组中的creator回调函数创建类对象。
6.根据权利要求5所述的装置,其特征在于,所述预设的类工厂包括至少两种类型类工厂;所述至少两种类型类工厂为所述源代码对应的目标软件项目中需要使用的类工厂。
7.根据权利要求6所述的装置,其特征在于,所述注册模块具体用于:
分别在所述第二程序区注册所述至少两种类型类工厂。
8.根据权利要求6所述的装置,其特征在于,所述装置还包括:
第三创建模块,用于在所述第二程序区注册预设的类工厂之前,预先创建一个类工厂注册宏;
所述注册模块具体用于:
利用所述类工厂注册宏在所述第二程序区注册所述至少两种类型类工厂。
9.一种电子设备,其特征在于,包括:存储器,处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,其中,所述处理器执行所述计算机程序时可以实现权利要求1至4任一所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810327920.2A CN108897532B (zh) | 2018-04-12 | 2018-04-12 | 一种类工厂注册的方法、装置及电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810327920.2A CN108897532B (zh) | 2018-04-12 | 2018-04-12 | 一种类工厂注册的方法、装置及电子设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108897532A CN108897532A (zh) | 2018-11-27 |
CN108897532B true CN108897532B (zh) | 2022-01-04 |
Family
ID=64342101
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810327920.2A Active CN108897532B (zh) | 2018-04-12 | 2018-04-12 | 一种类工厂注册的方法、装置及电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108897532B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108845792B (zh) * | 2018-04-12 | 2022-01-04 | 武汉斗鱼网络科技有限公司 | 一种类工厂注册的方法、装置及电子设备 |
CN108897532B (zh) * | 2018-04-12 | 2022-01-04 | 武汉斗鱼网络科技有限公司 | 一种类工厂注册的方法、装置及电子设备 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6968538B2 (en) * | 2001-06-01 | 2005-11-22 | Symyx Technologies, Inc. | System and methods for integration of custom classes into pre-existing objects models |
CN101833498A (zh) * | 2009-07-31 | 2010-09-15 | 北京伟晨豪嘉科技有限责任公司 | 一种基于测试脚本技术的嵌入式系统自动化检测系统 |
CN105681346A (zh) * | 2016-03-15 | 2016-06-15 | 福建星海通信科技有限公司 | 一种基于工厂类实现报文解析的方法 |
CN107357650A (zh) * | 2017-06-06 | 2017-11-17 | 武汉斗鱼网络科技有限公司 | 一种基于图片资源的内存自动释放方法及系统 |
CN108897532A (zh) * | 2018-04-12 | 2018-11-27 | 武汉斗鱼网络科技有限公司 | 一种类工厂注册的方法、装置及电子设备 |
-
2018
- 2018-04-12 CN CN201810327920.2A patent/CN108897532B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6968538B2 (en) * | 2001-06-01 | 2005-11-22 | Symyx Technologies, Inc. | System and methods for integration of custom classes into pre-existing objects models |
CN101833498A (zh) * | 2009-07-31 | 2010-09-15 | 北京伟晨豪嘉科技有限责任公司 | 一种基于测试脚本技术的嵌入式系统自动化检测系统 |
CN105681346A (zh) * | 2016-03-15 | 2016-06-15 | 福建星海通信科技有限公司 | 一种基于工厂类实现报文解析的方法 |
CN107357650A (zh) * | 2017-06-06 | 2017-11-17 | 武汉斗鱼网络科技有限公司 | 一种基于图片资源的内存自动释放方法及系统 |
CN108897532A (zh) * | 2018-04-12 | 2018-11-27 | 武汉斗鱼网络科技有限公司 | 一种类工厂注册的方法、装置及电子设备 |
Non-Patent Citations (1)
Title |
---|
MFC在开发COM对象的应用;范建军等;《咸宁学院学报》;20040131;第24卷(第3期);第31-34页 * |
Also Published As
Publication number | Publication date |
---|---|
CN108897532A (zh) | 2018-11-27 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
DE60102305D1 (de) | Migration von prozessen unter benutzung einer darstellung dieser prozesse in einer daten-darstellungssprache in einer verteilten rechnerumgebung | |
CN111249736B (zh) | 代码处理方法及装置 | |
WO1997048033A2 (en) | Data representation for mixed-language program development | |
CN103902653A (zh) | 一种构建数据仓库表血缘关系图的方法和装置 | |
CN113031967B (zh) | 一种代码转换方法及装置 | |
CN108897532B (zh) | 一种类工厂注册的方法、装置及电子设备 | |
CN110058904B (zh) | 数据转移方法、装置及服务器 | |
CN109271247A (zh) | 内存优化方法、装置、计算机装置以及存储介质 | |
CN110908644B (zh) | 状态节点的配置方法、装置、计算机设备和存储介质 | |
CN102799423A (zh) | Jsf中执行动态方法的方法及装置 | |
CN108845792B (zh) | 一种类工厂注册的方法、装置及电子设备 | |
CN111580938A (zh) | 一种工作单元的事务处理方法、装置、设备及介质 | |
CN109582318A (zh) | Portobuf本地化的处理方法、装置、终端及存储介质 | |
CN111273913B (zh) | 一种输出规范表示的应用程序接口数据的方法及装置 | |
CN114003661A (zh) | 离线数据录入方法、装置、电子设备及存储介质 | |
CN113918254A (zh) | 语言文本管理方法、装置、存储介质及电子设备 | |
CN114356290A (zh) | 一种数据处理方法、装置及计算机可读存储介质 | |
CN109857380B (zh) | 一种工作流文件编译方法及装置 | |
CN114253595A (zh) | 代码仓库管理方法、装置、计算机设备及存储介质 | |
CN105183491A (zh) | 跨平台的桌面gis系统及其启动方法 | |
CN112752163A (zh) | 用于配置默认语言的方法、装置和电视机 | |
CN112528282B (zh) | 反混淆代码的方法、装置和电子设备 | |
CN112667245B (zh) | 一种代码处理方法、装置、电子设备及存储介质 | |
CN112799738B (zh) | 一种配置文件的导入方法、装置及设备 | |
CN110750597A (zh) | 数据处理方法及装置、存储介质和处理器 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |