本发明涉及应用程序开发技术领域,尤其涉及一种对象处理方法、装置、电子设备及存储介质。
背景技术:
目前企业级应用系统大多采用三层或者多层应用模式。而大多数企业级应用系统都选择了面向对象的编程技术。所谓“对象”就是一个或一组数据以及处理这些数据的方法和过程的集合。对象的产生有两种基本方式。一种是以原型对象为基础产生新的对象,一种是以类为基础产生新的对象。
在实际应用中,现有技术可以通过new和delete操作符来实现类对象的创建和释放,为了避免内存的泄露,通常这两个操作符需要成对地使用。
而在实际编程过程中,经常会出现创建类对象和释放类对象是在不同的模块(动态链接库)中进行,这样很容易出现错误。
技术实现要素:
本发明提供了一种对象处理方法、装置、电子设备及存储介质,用于解决现有技术通过模块创建的对象在实际编程过程中,存在通过其他模块释放的技术问题。
本发明提供了一种对象处理方法,包括:
当接收到针对预设注册实现类的对象创建指令时,在预设的可扩展对象创建系统中获取所述注册实现类对应的动态扩展模块;
通过所述动态扩展模块创建所述注册实现类的对象;
当接收到针对所述对象的释放指令时,在所述可扩展对象创建系统中获取所述对象对应的所述动态扩展模块;
通过所述动态扩展模块释放所述对象。
可选地,所述当接收到针对预设注册实现类的对象创建指令时,在预设的可扩展对象创建系统中获取所述注册实现类对应的动态扩展模块的步骤之前,还包括:
创建接口;
向预设的可扩展对象创建系统声明所述接口;
在所述动态扩展模块中编写已声明的所述接口的实现类;
向所述可扩展对象创建系统注册所述实现类,得到注册实现类。
可选地,所述通过所述动态扩展模块创建所述注册实现类的对象的步骤,包括:
通过所述动态扩展模块获取所述注册实现类的标识符;
基于所述标识符获取所述注册实现类的构造函数;
采用所述构造函数,创建所述注册实现类的对象。
可选地,所述通过所述动态扩展模块释放所述对象的步骤,包括:
通过所述动态扩展模块基于所述标识符,获取所述注册实现类的析构函数;
采用所述析构函数释放所述对象。
本发明还提供了一种对象处理装置,包括:
第一动态扩展模块获取模块,用于当接收到针对预设注册实现类的对象创建指令时,在预设的可扩展对象创建系统中获取所述注册实现类对应的动态扩展模块;
对象创建模块,用于通过所述动态扩展模块创建所述注册实现类的对象;
第二动态扩展模块获取模块,用于当接收到针对所述对象的释放指令时,在所述可扩展对象创建系统中获取所述对象对应的所述动态扩展模块;
对象释放模块,用于通过所述动态扩展模块释放所述对象。
可选地,还包括:
接口创建模块,用于创建接口;
接口声明模块,用于向预设的可扩展对象创建系统声明所述接口;
实现类编写模块,用于在所述动态扩展模块中编写已声明的所述接口的实现类;
实现类注册模块,用于向所述可扩展对象创建系统注册所述实现类,得到注册实现类。
可选地,所述对象创建模块,包括:
标识符获取子模块,用于通过所述动态扩展模块获取所述注册实现类的标识符;
构造函数获取子模块,用于基于所述标识符获取所述注册实现类的构造函数;
对象创建子模块,用于采用所述构造函数,创建所述注册实现类的对象。
可选地,所述对象释放模块,包括:
析构函数获取子模块,用于通过所述动态扩展模块基于所述标识符,获取所述注册实现类的析构函数;
对象释放子模块,用于采用所述析构函数释放所述对象。
本发明还提供了一种电子设备,所述设备包括处理器以及存储器:
所述存储器用于存储程序代码,并将所述程序代码传输给所述处理器;
所述处理器用于根据所述程序代码中的指令执行如上任一项所述的对象处理方法。
本发明还提供了一种计算机可读存储介质,所述计算机可读存储介质用于存储程序代码,所述程序代码用于执行如上任一项所述的对象处理方法。
从以上技术方案可以看出,本发明具有以下优点:本发明通过当接收到针对预设注册实现类的对象创建指令时,在预设可扩展对象创建系统中获取注册实现类对应的动态扩展模块;通过动态扩展模块创建注册实现类的对象;当接收到针对对象的释放指令时,在可扩展对象创建系统中获取对象对应的动态扩展模块;通过动态扩展模块释放对象。解决了现有技术通过模块创建的对象在实际编程过程中,存在通过其他模块释放的技术问题。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其它的附图。
图1为本发明实施例提供的一种对象处理方法的步骤流程图;
图2为本发明另一实施例提供的一种对象处理方法的步骤流程图;
图3为本发明实施例提供的一种对象处理方法的过程示意图;
图4为本发明实施例提供的一种对象处理装置的结构框图。
具体实施方式
本发明实施例提供了一种对象处理方法、装置、电子设备及存储介质,用于解决现有技术通过模块创建的对象在实际编程过程中,存在通过其他模块释放的技术问题。
为使得本发明的发明目的、特征、优点能够更加的明显和易懂,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,下面所描述的实施例仅仅是本发明一部分实施例,而非全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
请参阅图1,图1为本发明实施例提供的一种对象处理方法的步骤流程图。
本发明提供的一种对象处理方法,具体可以包括以下步骤:
步骤101,当接收到针对预设注册实现类的对象创建指令时,在预设的可扩展对象创建系统中获取注册实现类对应的动态扩展模块;
在本发明实施例中,动态扩展模块可以为动态链接库或组件库。
动态链接库(dynamiclinklibrary,dll)是windows操作系统中。实现共享函数库概念的一种方式。这些函数的扩展名“.dll”、“.ocx”(包含activex控制的库),或者“.drv”(旧式的系统驱动程序)。动态链接提供了一种方法,是进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个dll文件中,该dll文件包含一个或多个已被翻译、链接并与使用它们的进程分开存储的函数。dll还有助于共享数据和资源。多个应用程序可以同时访问内存中单个dll副本的内容。使用动态链接库可以较为容易地将更新应用于各个模块,而不会影响该程序的其他部分。dll提供了如模块化这样的共享库的作用,模块化允许仅仅更改几个应用程序共享使用的一个dll中的代码和数据而不需要更改应用程序自身。模块化的另外一个好处是插件的通用接口使用。单个的接口允许旧的模块与新的模块一样能够与以前的应用程序运行时无缝地集成到一起,而不需要对应用程序本身作任何更改。
在本发明实施例中,可以预先构建一个可扩展对象创建系统,该系统中部署有动态链接库。其中,动态链接库可以为一个或多个。
在本发明实施例中,可拓展对象创建系统可以进行插件化、组件化编程。同时可以提供接口的声明、实现类的注册、对象的创建和释放、动态扩展模块的加载与卸载、获取指定接口的所有注册的实现类的注册名字等方法。
在实际应用中,当接收到针对预设注册实现类的对象创建指令时,可以在预设的可拓展对象创建系统中获取注册实现类对应的动态扩展模块,以进行对象创建。
步骤102,通过动态扩展模块创建注册实现类的对象;
在获取到进行对象创建的动态扩展模块后,可以通过可扩展对象创建系统提供的创建对象的方法进行注册实现类的对象创建,然后通过注册实现类对应的接口完成相关方法的调用。其中,注册实现类可以与其接口在同一个动态扩展模块中,也可以不在同一个动态扩展模块中。
步骤103,当接收到针对对象的释放指令时,在可扩展对象创建系统中获取对象对应的动态扩展模块;
步骤104,通过动态扩展模块释放对象。
在本发明实施例中,在完成了对象创建后,当接收到针对该对象的释放指令时,可以在可扩展对象创建系统中获取注册实现类对应的动态扩展模块,以通过该动态扩展模块释放该对象。
本发明通过在可扩展对象创建系统中获取注册实现类对应的动态扩展模块,以通过该动态扩展模块进行对象创建。同时,根据注册实现类与动态扩展模块的对应关系,可以在需要释放对象时,获取同一个动态扩展模块进行对象释放操作。
请参阅图2,图2为本发明另一实施例提供的一种对象处理方法的步骤流程图。该方法具体可以包括以下步骤:
步骤201,创建接口;
接口,是抽象方法和常量值的定义的集合,从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。接口一般定义如何使用。包括外部程序如何调用,以及自己的内部程序之间如何调用。
在本发明实施例中,使用者可以在通用的基础模块/底层模块中编写所需要的接口,例如icommand类接口。其中,本发明实施例创建的接口需要满足如下要求:所有方法必须是纯虚方法且不包含任何成员变量,接口必须处于某个.h文件当中。
纯虚方法也叫抽象函数,一般来说它只有函数名、参数和返回值类型,不需要函数体。这意味着它没有函数的实现,需要让派生类去实现。
c++中的纯虚方法,一般在函数签名后使用=0作为此类函数的标志。java、c#等语言中,则直接使用abstract作为关键字修饰这个函数签名,表示这是纯虚方法。
步骤202,向预设的可扩展对象创建系统声明接口;
在本发明实施例中,在完成了接口创建后,可以向可扩展对象创建系统声明该接口。
在一个示例中,可通过可扩展对象创建系统提供的声明方法,如extensible_factory_declare进行声明。单个接口只需要声明一次即可。同时,在接口所在模块的任意include接口所在的.h文件的.cpp文件当中通过可扩展对象创建系统提供的声明方法extensible_factory_define进行定义。
步骤203,在动态扩展模块中编写已声明的接口的实现类;
类是现实世界或思维世界中的实体在计算机中的反映,它将数据以及这些数据上的操作封装在一起。实现类,用于实现接口的功能。
在本发明实施例中,可以在动态扩展模块中编写该接口的实现类,并实现继承该接口的所有纯虚方法。
其中,实现类的技术要求如下:其构造函数必须满足可扩展的对象创建系统的要求,第一个参数的类型必须为constchar*,第二个参数的类型必须为constvoid*,且只能包含着两个参数。
步骤204,向可扩展对象创建系统注册实现类,得到注册实现类;
在完成实现类的编写后,可以在可扩展创建系统的动态扩展模块的实现类的源文件(cpp)中进行实现类的注册。
具体地,可通过可扩展对象创建系统提供的进行注册的方法extensible_factory_register进行注册,从而得到注册实现类。
需要注意的是,具体的实现类只能向其继承的接口进行注册;同一个实现类可以注册多个名字且只需要注册一次即可;同一个接口可以被多个实现类注册。
步骤205,当接收到针对预设注册实现类的对象创建指令时,在预设的可扩展对象创建系统中获取注册实现类对应的动态扩展模块;
在本发明实施例中,在接收到针对预设注册实现类的对象创建指令后,可以通过可扩展对象创建系统提供的方法加载动态扩展模块。
在一个示例中,该加载动态扩展模块的方法可以为extensible_factory_load_dlls。
步骤206,通过动态扩展模块创建注册实现类的对象;
对象是对客观事物的抽象。是具有类类型的变量。类和对象是面向对象编程技术中的最基本的概念。类是对象的抽象,而对象是类的具体实例。类是一个模板,其描述一类对象的行为和状态,而对象是类的一个示例,有状态和行为。例如,狗是一个类,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。
在本发明实施例中在完成了动态扩展模块的加载操作后,可以通过动态扩展模块创建注册实现类的对象。
具体地,通过可扩展对象创建系统提供的方法extensible_factory_get_xxx进行对象的创建,其中,xxx为接口类的名称。
在一个示例中,步骤206可以包括以下子步骤:
s61,通过动态扩展模块获取注册实现类的标识符;
s62,基于标识符获取注册实现类的构造函数;
s63,采用构造函数,创建注册实现类的对象。
在具体实现中,创建对象的时候可以通过指定的标识符通过全局的map获取实现类的构造函数,调用构造函数创建接口类的对象。
其中,构造函数主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。一个类可以有多个构造函数,可根据其参数个数的不同或参数类型的不同来区分。
步骤207,当接收到针对对象的释放指令时,在可扩展对象创建系统中获取对象对应的动态扩展模块;
在本发明实施例中,当接收到针对对象的释放指令时,可以通过创建该对象的动态扩展模块,进行对象释放。
步骤208,通过动态扩展模块释放对象。
在本发明实施例中,可通过可扩展对象创建系统提供的释放对象的方法extensible_factory_release_xxx进行对象的释放,其中,xxx为接口类的名称。
在一个示例中,步骤208可以包括以下子步骤:
s81,通过动态扩展模块基于标识符,获取注册实现类的析构函数;
s82,采用析构函数释放对象。
在具体实现中,在释放对象的时候,可以通过指定的标识符通过全局的map获取实现类的析构函数,调用析构函数释放接口类的对象。
其中,析构函数与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,可以执行析构函数来释放对象。
需要说明的是,所有的实现类的构造函数和析构函数必须是固定的格式,统一的参数类型、参数顺序和参数个数。
本发明通过在可扩展对象创建系统中获取注册实现类对应的动态扩展模块,以通过该动态扩展模块进行对象创建。同时,根据注册实现类与动态扩展模块的对应关系,可以在需要释放对象时,获取同一个动态扩展模块进行对象释放操作。
为便于理解,以下通过具体示例对本发明实施例进行说明:
请参阅图3,图3为本发明实施例提供的一种对象处理方法的过程示意图。
如图3所示,可扩展对象创建系统提供了接口的声明、实现类的注册、对象的创建和释放等操作,此外还提供了动态扩展模块的加载与卸载、获取指定接口的所有注册的实现类的注册名字等方法。其实现原理如下:
1、extensible_factory_declare负责声明对应接口类的工厂方法,声明的方法为extensible_get_xxx等,其中,xxx为接口类名称。
2、extensible_factory_define负责对声明的工厂方法进行实现,实现原理是:创建对象的时候通过指定的标识符通过全局的map获取实现类的构造函数,调用构造函数创建接口类的对象,释放对象的时候通过指定的标识符通过全局的map获取实现类的析构函数,调用析构函数释放接口类的对象。因此所有实现类的构造函数和析构函数必须是固定的格式,统一的参数类型、参数顺序和参数个数。
3、extensible_factory_register负责将实现类的相关信息(类名、构造函数、析构函数等)注册到全局的map中。
4、应用程序通过可扩展对象创建系统的extensible_factory_get_xxx和extensible_factory_release_xxx方法来创建和释放对象。
其使用示例如下:
//common模块需要定义dll_api_spec=__declspec(dllexport)
//common模块的command.h
//icommand即一个接口,所有方法均为纯虚方法,且不包含成员变量
classicommand
{
virtualconstchar*getcommandname()=0;
virtualvoidsetcommandname(constchar*cmdname)=0;
};
#ifndefdll_api_spec
#definedll_api_spec__declspec(dllimport)
#endif
extensible_factory_declare(icommand,dll_api_spec);
//common模块的command.cpp
#include“command.h”
extensible_factory_define(icommand);
//组件模块commandspectial的commandimp.cpp
classcommand1
{
//构造函数必须是下面的形式,参数类型和个数固定
command1(constchar*csaparam,constvoid*binparam)
{
}
constchar*getcommandname()
{
return0;
}
voidsetcommandname(constchar*cmdname)
{
}
};
extensible_factory_register(icommand,command1,“cmd1”,“命令1”);
classcommand2
{
//构造函数必须是下面的形式,参数类型和个数固定
command2(constchar*csaparam,constvoid*binparam)
{
}
constchar*getcommandname()
{
return0;
}
voidsetcommandname(constchar*cmdname)
{
}
};
extensible_factory_register(icommand,command2,“cmd2”,“命令2”);
//对icommand接口的使用
#include“command.h”
//先加载命令所在组件
extensible_factory_load_dlls(“commandspectial”);
//通过可扩展工厂创建对应的类对象
icommand*command1=extensible_factory_get_icommand(“cmd1”,0);
//通过可扩展工厂释放对应的类对象
extensible_factory_release_icommand(command1);
icommand*command2=extensible_factory_get_icommand(“cmd2”,0);
extensible_factory_release_icommand(command2);
请参阅图4,图4为本发明实施例提供的一种对象处理装置的结构框图。
本发明实施例提供的一种对象处理装置,包括:
第一动态扩展模块获取模块401,用于当接收到针对预设注册实现类的对象创建指令时,在预设的可扩展对象创建系统中获取注册实现类对应的动态扩展模块;
对象创建模块402,用于通过动态扩展模块创建注册实现类的对象;
第二动态扩展模块获取模块403,用于当接收到针对对象的释放指令时,在可扩展对象创建系统中获取对象对应的动态扩展模块;
对象释放模块404,用于通过动态扩展模块释放对象。
在本发明实施例中,还包括:
接口创建模块,用于创建接口;
接口声明模块,用于向预设的可扩展对象创建系统声明接口;
实现类编写模块,用于在动态扩展模块中编写已声明的接口的实现类;
实现类注册模块,用于向可扩展对象创建系统注册实现类,得到注册实现类。
在本发明实施例中,对象创建模块402,包括:
标识符获取子模块,用于通过动态扩展模块获取注册实现类的标识符;
构造函数获取子模块,用于基于标识符获取注册实现类的构造函数;
对象创建子模块,用于采用构造函数,创建注册实现类的对象。
在本发明实施例中,对象释放模块404,包括:
析构函数获取子模块,用于通过动态扩展模块基于标识符,获取注册实现类的析构函数;
对象释放子模块,用于采用析构函数释放对象。
本发明实施例还提供了一种电子设备,设备包括处理器以及存储器:
存储器用于存储程序代码,并将程序代码传输给处理器;
处理器用于根据程序代码中的指令执行本发明任一实施例的对象处理方法。
本发明实施例还提供了一种计算机可读存储介质,计算机可读存储介质用于存储程序代码,程序代码用于执行本发明任一实施例的对象处理方法。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
本领域内的技术人员应明白,本发明实施例的实施例可提供为方法、装置、或计算机程序产品。因此,本发明实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。
本发明实施例是参照根据本发明实施例的方法、终端设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明实施例范围的所有变更和修改。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。
以上所述,以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。