2

2 つのオブジェクトを構築する必要がAありBます。これらABオブジェクトはさまざまな方法で初期化できます。

構築する設計パターンA(作業中):

AサブクラスA_txtA_tsvA_csvなどがあります。各Aサブタイプは (ファイル パス) から構築されstringますが、それぞれが異なる方法でファイルをロードします。そのオブジェクトを作成するための適切なファクトリにファイルの種類 ( ) をマップするレジストリを作成しました。txt

txt--> A_txt_Factory
tsv--> A_tsv_Factory
...

WhereA_txt_factoryはファイル パスを受け取り、それをテキスト ファイルとして読み込み、A_txtオブジェクトへのポインターを返します。

一緒に、このレジストリをファクトリとして使用します。ファイル パスとファイル タイプを指定すると、そのタグに対応するファクトリを検索し、それを使用してAオブジェクトを構築し、ポインタを返します。

この組み合わせのレジストリとファクトリ デザイン パターンがとても気に入っています。他の誰かが簡単に独自のファイル タイプとそれをロードするためのファクトリを作成し、それをレジストリにチェックインして、他のコードを見ずに使用することができます。

構築する設計パターンB(助けが必要):

Bすべてが同じタイプから読み込まれるわけではないため、オブジェクトの構築はより困難です (たとえば、すべてのAサブタイプはstringファイル パスを示す で構築されます)。B_textはテキスト ファイルから (stringファイル パスを示す提供された から) ロードしますが、以前とは異なりB_intAndA、 int および のインスタンスから初期化できますA

どのようなデザイン パターンを使用して作成できますBか? 前と同じように、stringどのファクトリを使用するかを示すタグを付けます。ただし、以前とは異なり、各ファクトリは異なるパラメーター (および場合によっては異なる数のパラメーター) を受け入れます。可変パラメータの可変テンプレート関数を使用して何とか達成できると思います(私はC++ 11を使用しているので、それはオプションです)。

この設計パターンは、他の誰か (同じ基本クラスですが、異なる型の異なる数の引数で構築されています) に出くわすことはありますか?

さまざまなサブタイプを構築する個々のファクトリを作成するのは簡単ですが、Bさまざまなタイプと数のパラメーターを受け入れるため、レジストリでインデックスを作成できるようにする方法を知るのは困難です。

これをどのように処理しますか?

4

1 に答える 1

0

ある時点 T 1で、作成される B の種類が判明します。B の種類は、コンストラクターの署名を意味します。ある時点 T 2 (同じかそれ以降) で、B が作成されます。

ポイント T 1で引数の値がわかっている場合、T 2 = T 1の場合は、ここで B を作成するだけで問題は解決します。それ以外の場合、 T 2 > T 1の場合、引数と作成呼び出しをファンクタ (例: [=]() -> B* { return new B_int_and_A( 42, *anAPointer ); }) に格納し、それを例として a としてstd::functionT 2に渡します。

そうではなく、ポイント T 1で引数の値が不明な場合は、 T 2 > T 1である必要があり、B の種類に関係なく、引数の値は T 2で既知である必要があります。この場合、B kind id を T 2に渡します。次に、ポイント T 2で、引数と作成関数を id から検索します (たとえば、 a で) switch

ただし、これが C++ とどのように関係しているかはわかりません。

接続は何ですか?

于 2012-08-08T21:45:22.443 に答える