2

私のライブラリには、インターフェイス (カメラを表す) といくつかの派生クラスが含まれています。
各派生クラスは特定のハードウェアに実装されるため、各派生クラスは外部ベンダー ライブラリに依存します。

  • 各派生クラスは静的ライブラリであり、そのライブラリの依存関係をリンクします

  • Factoryメソッドが 1つある という名前のクラスを 1 つだけ提供します。
    ICamera* create(const std::string& type)

  • ファクトリはすべての派生クラスを #include してリンクし、ライブラリ ユーザーは派生 impl を認識しません。create()素朴に実装されています:

    if (type == "a") return new CameraA();
    if (type == "b") return new CameraB();
    ...

基本的に、必要なすべての依存関係を含む肥大化した Factory.lib が 1 つあり、ライブラリ ユーザーは Factory.lib にリンクするだけで任意のカメラ impl を作成できます。

質問

  1. Factory.lib にリンクすると、アプリケーションの実行時にすべてのベンダーのすべての dll が必要になります。理想的には、使用している特定のカメラの dll のみが必要になることを望みます。これを達成する方法はありますか?
  2. それぞれの派生物を lib ではなく dll としてコンパイルすることを検討しています。現在、Factory.lib は肥大化しておらず、すべてのカメラ固有の依存関係は派生した各 dll にあります。#1 を解決しない場合li、これはあまり役に立ちません。Factory.lib とベンダーの dll に加えて、すべての派生 dll が必要になるからです。
  3. Creator クラス (またはメソッド) を実装するより良い方法はありますか? 私の派生クラスは 5 ~ 6 と限られており、頻繁に成長することはありません。
  4. 依存関係を最小限に抑え、設計を改善するためのその他のヒントは大歓迎です
4

1 に答える 1

3

実行時に共有ライブラリ(またはdll)をロードできます。特定のICamera実装を探す場所(どのdll)を知る手がかりが必要です。たとえば、特定のdllによって提供される実装(type=="a"およびtype=="c")の情報を正確に提供する、dllごとに2番目の関数をエクスポートできます。アプリケーションを起動すると、dllを検索し、すべてのdllに対してその情報インターフェイスを呼び出すことができます。

于 2012-07-10T09:10:34.253 に答える