0

この数週間、私はこの問題に悩まされてきました。私の現在の実装は機能しますが、これを行う「良い方法」があるかどうか知りたいです。私はパターンを設計するのが初めてなので、これはばかげた質問かもしれません。

簡単に言えば、次のものがあります。

  • インターフェイスを提供するオブジェクト プロトタイプ (抽象カーネルと呼びましょう)。
  • 上記のインターフェースをさまざまな方法で実装する特定のカーネル。
  • 具体的なカーネル ファクトリ。
  • ファクトリによって返される、抽象カーネルへのポインタを格納する別のオブジェクト Foo。

私の問題はこれです。特定のカーネルの実装では、カーネルごとに異なる独自のパラメーター セットを定義する場合があります。Foo はカーネルを使用して何らかの処理を行いますが、この処理は最終的にこれらのパラメーターに依存しており、適切な方法でそれらを構成する方法がわかりません。

抽象的なファクトリに行きたくないし、構築する前に具体的なファクトリを構成したくありません。これは私には間違っているように思えるからです。パラメータを持つのはファクトリではなく、カーネルです。

しかし一方で、Foo のカーネル ポインターを public に設定しても、プロトタイプのインターフェイスの一部ではないため、基になるカーネルのパラメーターにアクセスできません...他の人がこれを持っていると確信しています前に問題が発生しました。おそらく、私にはわからない簡単な解決策があります。:S

前もって感謝します!

注: 現在の実装では、カーネル ファクトリはありません。カーネルの具体的な型を Foo のテンプレートとして置き、カーネルを public メンバーとして設定します。これにより、宣言後、処理を開始する前にカーネルを構成できます。

4

2 に答える 2

1

あなたが言ったように、プロトタイプ インターフェイスの一部ではないものは では利用できませんFooFoo各カーネル実装の詳細を知っている場合、ファクトリ パターンを使用しても意味がありません。

一部の限られた状況では、プロトタイプ インターフェースに次のゲッターとセッターのようなものを追加すると、作業が完了する可能性があります。

virtual bool setParameter (const string &key, const string &value) = 0;
virtual string getParameter (const string &key) = 0;
于 2013-01-09T16:43:48.120 に答える
1

コードの一部が動作するカーネルの具体的な種類を認識している場合、その特定の具体的なカーネル タイプへのポインターが必要です。そうでない場合、特定のパラメーターにアクセスできません (ただし、@Jaywalker が提案する一般的な方法ですべてのパラメーターにアクセスできる可能性があります)。

現在の実装は最初のルートに進んでいるようですが、これは完全に問題ありません。

あなたの設計に関する情報は非常に限られていますが、具体的なカーネル タイプがいくつかあり、タイプごとに個別のビルダーがあり、タイプごとに個別のコンフィギュレーターがあるようです。すべてのビルダーを Factory にパックすることには問題があります。具体的なカーネル タイプをそれぞれのコンフィギュレーターに転送するクリーンで洗練された方法がないためです (*_cast<>または二重ディスパッチなどを除く)。これを解決して Factory を保持するには、少なくとも 2 つの方法があります。

  1. 各ビルダーをそれぞれのコンフィギュレーターにバンドルし、すべてのバンドルを、構成済みのカーネルを大量生産する Factory にパックします。
  2. 各カーネルをそのコンフィギュレータにバンドルし、これらのバンドルを生成する Factory を作成します (この方法では、カーネルはライフサイクル中に何度でも構成できます)。
于 2013-01-09T17:13:34.623 に答える