要するに、プラグインがメインアプリケーションのオブジェクトを置き換えることができるように、ファクトリー+プラグインメカニズムを設計および実装する最良の方法は何ですか.
アプリケーションを構築するためのコード ベースがあります。コード ベースは、アプリケーションの 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 にはいくつかのデフォルトの動作がありますが、プラグインによってオーバーライドおよび変更できます。
現在の実装では、新しいカスタマイズされたクラスを追加することが難しくなっています。メイン アプリケーションのすべてのクラスをプラグインから置き換えたいので、オブジェクト ファクトリを使用することは理にかなっています。
私が知っている 1 つの SDK では、次の手法が使用されています。
PluginInterface* PluginInit(GodObject* godObject)
{
FactoryForSomeClasses* factoryForSomeClasses =
godObject->factoryForSomeClasses();
factoryForSomeClasses->setSomeClass1Creator( MyCustomizedSomeClass1::create); // create is a static creator function.
factoryForSomeClasses->setSomeClass2Creator( MyCustomizedSomeClass2::create);
}
このアプローチに代わるものがあるのだろうか。
今説明したようなプラグイン システム/ファクトリをどのように設計および実装することをお勧めしますか?