OGRE之单件模式与DLL插件

在OGRE中插件系统扮演了非常关键的角色,它让引擎的灵活性,扩展性大大提高,用户可以通过创建一个DLL的插件类来向引擎添加自定义的各种管理器或者功能模块。

但是在单件模式和多个DLL的协作的实现却不是那么的容易,其中包含一些比较细节的问题。下面举一个我刚发生的错误例子:

一个插件测试解决方案:

    1.一个执行模块(exe)里面又两个文件:

           FactoryManager.h: 是单件对象FactoryManager头文件(在头文件中实现了所有的功能)  

           Main.cpp: 负责加载插件DLL,并调用工厂管理器实现一些简单输出

    2.一个插件库(dll),里面有4个文件:

           IFactory.h: 工厂接口类

           CFactory.h/cpp:具体的一个工厂实现

           Main.cpp:导入两个方法,如下:

  

在EXE的Main.cpp中进行如下操作:

1. 加载DLL,然后获取StartPlugin方法,执行。

2. 通过Factorymanager::Singleton()方法执行其他后续操作。

这时出现的问题就是两步调用的为不同的FactoryManager实例。

原因:

   1. 整个单件实现全部在头文件中,不存在模块链接的问题。

   2. 每个独立包含了该头文件的模块都会不受约束的创建一个自己所有的管理器单件实例。

试图解决的方法:

   将Singleton()方法实现挪动到cpp文件中。

产生问题:

   因为单件类目前在exe模块,所以无法链接,所以无法实现。

结论:

    上述方案的框架本身有问题,应该将单件类单独放置于一个DLL中,尽量的解耦。

新的解决方案:

    1. 创建新的FactoryManager.dll用来提供单件对象,提供h/cpp。

    2. Plugin.dll全部链接FactoryManager.lib来进行同上不变的操作

    3. Exe也链接FactoryManager.dll,对Plugin.dll进行加载并StartPlugin。

这样就形成了以FactoryManager为中心依赖的低耦合框架。在DLL链接的时候,FactoryManager也会唯一。

在OGRE中就是这种框架结构,所有的其他模块都以OgreMain(Root)为主依赖.

原文地址:https://www.cnblogs.com/KevinYuen/p/2940365.html