【发布时间】:2018-01-11 12:38:54
【问题描述】:
这是一个基于工厂模式的插件系统。
每个插件都扩展了Plugin 类并实现了一个工厂,将扩展的类返回给内核。
插件被编译为共享库。内核检查plugins/ 目录并在运行时加载所有库。
当点击红色按钮时,内核会在每个加载的插件上调用call_on_red_click()。
// Plugin.h
class Plugin {
public:
virtual void call_on_blue_click() = 0;
virtual void call_on_red_click() = 0;
}
// MyPlugin.h
class MyPlugin : public Plugin {
public:
void call_on_blue_click() {/*[...]*/}
void call_on_red_click() {
// Does something
// Optionaly, activate teleporter
}
}
Plugin *plug_factory() { return new MyPlugin; }
// MyOtherPlugin.h
class MyOtherPlugin : public Plugin {
public:
void call_on_blue_click() {/*[...]*/}
void call_on_red_click() {
// Does something else
// Optionaly, activate teleporter
}
}
Plugin *plug_factory() { return new MyOtherPlugin; }
传送器是单独编译的,可能不会出现在每个安装中(它是自己发货的)。 假设 MyPlugin 和 MyOtherPlugin 想要激活传送器如果它存在。
问题:
- Teleporter 应该是内核插件还是其他东西?
- 有这方面的设计模式吗?
【问题讨论】:
-
这将取决于您的平台,因此将被选为题外话。标记 O/S 和/或跨平台框架以获取更具体的信息。应该有一个 API 可以在某处手动加载 dll。如果你的 dll 只导出一个对象工厂,那么脏代码的数量就会减少。如果实际实现不可用,您可以轻松地使用对象的存根实现,或者如果您想在应用程序处于活动状态而不是启动时切换,则可以对实际实现使用 pimpl。
标签: c++ design-patterns plugins factory-pattern