3

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

我们有一个代码库,用于构建我们的应用程序。代码库适用于 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);
}

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

你会如何推荐像我刚才描述的那样设计和实现一个插件系统/工厂?

4

2 回答 2

2

不久前在 Dobb 医生那里有一篇文章讨论了这个确切的问题。这是相关文章的链接

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

于 2008-11-22T17:37:08.563 回答
1

您是否查看过插件框架的 CodeProject 示例? https://secure.codeproject.com/KB/DLL/plugin.aspx http://www.codeproject.com/KB/library/dynobj.aspx

于 2008-11-22T14:16:44.850 回答