【问题标题】:Changing default behavior in a C++ application with plugins [closed]使用插件更改 C++ 应用程序中的默认行为 [关闭]
【发布时间】:2008-11-22 11:49:34
【问题描述】:

简而言之:设计和实现工厂+插件机制的最佳方式是什么,以便插件可以替换主应用程序中的对象。

我们有一个用于构建应用程序的代码库。代码库适用于 70-95% 的应用程序,这意味着在每个新应用程序中我们需要更改 5-30% 的默认行为(添加新功能、更改默认逻辑、添加 GUI 等)。

实现是基于插件的:代码库内置在 EXE 和 DLL 中,当主 EXE 运行时,我们加载一个添加所需功能的 DLL。

目前每个插件都公开了以下功能:

PluginInterface* PluginInit()
{
    return new MyCustomizedPluginInterface();
}

其中 PluginInterface 定义为:

class PluginInterface {
public:
    virtual SomeClass1* customizedSomeClass1() = 0;
    virtual SomeClass2* customizedSomeClass2() = 0;
};

并且 SomeClass1/SomeClass2 有一些默认行为,但可以被插件覆盖和更改。

当前的实现很难添加新的自定义类。我们想用插件替换主应用程序中的每个类,所以使用对象工厂是有意义的。

我知道的一个 SDK 使用以下技术:

PluginInterface* PluginInit(GodObject* godObject)
{
    FactoryForSomeClasses* factoryForSomeClasses = 
        godObject->factoryForSomeClasses();
    factoryForSomeClasses->setSomeClass1Creator( MyCustomizedSomeClass1::create); // create is a static creator function.
    factoryForSomeClasses->setSomeClass2Creator( MyCustomizedSomeClass2::create);
}

我想知道这种方法是否有任何替代方法。

您如何建议设计和实现我刚才描述的插件系统/工厂?

【问题讨论】:

  • 您能否详细解释一下您将如何控制工厂中对象的实例化?在我们的插件设计中,我们有一个广泛的配置文件系统,它描述了如何加载对象以及对象层次结构。

标签: c++ plugins factory


【解决方案1】:

Dobb 医生不久前有一篇文章讨论了这个确切的问题。这是相关文章的a link

顺便说一句,您可能希望为项目的插件使用直接的 C 接口。这样,您可以轻松地将几乎任何语言编写的代码链接到您的框架中。虽然 C++ 很好,但能够利用比 C++ 中更多的东西,比如 Java 和 Python 领域中存在的令人难以置信的框架,从长远来看可能是有益的。

【讨论】:

    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 2021-10-22
      • 2014-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-21
      • 2015-08-17
      • 1970-01-01
      相关资源
      最近更新 更多