3

これに正式な名前があるかどうかはわかりませんが、「セルフファクトリー」パターンと呼んでいるもので遊んでいます。基本的には、抽象基本クラスがそれ自体のファクトリとして機能する場合です。説明させてください:

私のシステムには Foo オブジェクトと Bar オブジェクトがあり、これらはインターフェース FooInterface と BarInterface を介して使用されます。クライアントに正しいタイプの Foo と Bar を提供する必要があります。どの具体的な Foo オブジェクトを作成するかは、コンパイル時に決定されます。たとえば、win32 でコンパイルする場合は Win32Foo オブジェクトのみを作成し、OSX でコンパイルする場合は OSXFoo オブジェクトのみを作成します。ただし、どの具体的な Bar オブジェクトを作成するかは、キー文字列に基づいて実行時に決定されます。

さて、私の質問は、このスキームを実装する最良の方法についてです。私が思いつく1つの方法は、通常の工場を使用します:

shared_ptr<FooInterface> foo = FooFactory::create();
shared_ptr<BarInterface> happyBar = BarFactory::create("Happy");
shared_ptr<BarInterface> sadBar = BarFactory::create("Sad");

別の方法は、私が「セルフファクトリー」と呼んでいるものを使用することです:

shared_ptr<FooInterface> foo = FooInterface::create();
shared_ptr<BarInterface> happyBar = BarInterface::create("Happy");
shared_ptr<BarInterface> sadBar = BarInterface::create("Sad");

ユーザビリティの観点とアーキテクチャの観点の両方から、各アプローチの長所と短所は何ですか?

4

3 に答える 3

3

私は改善を行います:

shared_ptr<FooInterface> foo = Factory<FooInterface>::create();
shared_ptr<BarInterface> happyBar = Factory<BarInterface>::create("Happy");
shared_ptr<BarInterface> sadBar = Factory<BarInterface>::create("Sad");

あなたは宣言するでしょう:

template <class I>
struct Factory { };

次に、ファクトリを必要とするインターフェイスごとに、次のようにします。

template <>
struct Factory<FooInterface>
{
    static FooInterface create();
};

これにより、ファクトリ実装をインターフェイス宣言とは別に保つことができますが、コンパイル時に型システムを使用してそれらをバインドすることもできます。

于 2009-06-24T22:12:42.107 に答える
2

工場には2つの一般的な用途があります。

1)パラメーターやグローバル状態(構成など)に基づいて、実行時に動的ポリモーフィックタイプを決定します。あなたのパターンはこれを行います。

2)依存性注入:静的関数を使用してオブジェクトを作成するのではなく、ファクトリオブジェクトを使用します。これにより、呼び出し元は、必要なファクトリを渡すことで、返されるオブジェクトのタイプを構成できます。これらのパターンのどちらもこれを提供しません。さらに、2番目のパターンでは、インターフェイスとファクトリが同じであるため、静的な依存性注入(ファクトリクラスをテンプレートパラメータとして受け取るテンプレート関数を持つことによる)も許可されません。

したがって、パターン(および通常のファクトリ)の欠点の1つは、依存性注入が実際にはサポートされていないことです。FooInterfaceであるオブジェクトを取得するために呼び出す関数は1つだけであり、それはFooInterface :: create()です。依存性注入がなぜ有用であるかについては議論しません。このように構築すると、それを使用できないことを指摘してください。

于 2009-06-24T22:04:05.040 に答える
1

通常、ファクトリはクラス階層全体のオブジェクトを作成する責任があります。したがって、あなたの例では、Win32Factory、OSXFactory などがあります。これの利点の 1 つは、特定の実装 (win32/unix/etc) を一度だけ選択する必要があることです。ファクトリの作成中に、クラス インターフェイスを使用する場合は、 OS情報を常に提供します。

create2 つのクラス (Foo と Bar) しかない場合、インターフェイスのメソッドを使用するだけでなく、それらのファクトリを作成する価値があるかどうかはわかりません。

ああ、インターフェイスにそのタイプのオブジェクトを作成するメソッドがある場合、それはファクトリ メソッド パターンと呼ばれます。

于 2009-06-24T22:01:08.417 に答える