6

いくつかの派生クラスを持つ ABC があります。これらの派生クラスを作成するには、ファクトリ パターンを使用します。

.h ファイル:

class derivedFactory
{
public:
    base* createInstance();
};

.cpp ファイル:

base* derivedFactory::createInstance()
{
    return new derived();
}

無料の関数を使用するだけで、これに利点はありますか:

.h ファイル:

base* derivedFactoryFunction();

.cpp ファイル:

base* derivedFactoryFunction()
{
    return new derived();
}

また、依存性注入には抽象ファクトリ パターンを使用します。ABC に基づく継承階層を使用する場合があります。

class objectCreator
{
public:
    base* create() = 0;
};

関数ポインタよりもこれを使用する利点はありますか:

boost::function<base* ()> factory_ptr;

boost::bind/lambda を使用すると、コードがより構成可能になるようです。必要に応じて、実際のファクトリ オブジェクトをラップできます。パフォーマンスがわずかに低下する可能性があることがわかりますが、これは起動時にのみ呼び出されるため、心配する必要があります。

4

4 に答える 4

2

それは、工場がどの程度柔軟である必要があるかによって異なります。ファクトリがオブジェクトの構築方法を決定するために外部情報 (構成ファイル、プログラム オプションなどから) を必要とする場合、オブジェクトは理にかなっています。ファクトリへの引数だけが必要な場合は、おそらく関数で十分です。

ポインタを持つことの唯一の利点は、別のファクトリ関数を使用できるテスト用です。

于 2009-02-11T12:08:48.223 に答える
1

単一のメソッドまたはメソッドへのポインターを持つインターフェイスを持つことは同等です。

しかし、2 番目のケースでは、別の方法を最初の方法と一緒に実行したい場合に問題が発生します...

私の意見では、インターフェースはメソッドポインタよりも読みやすいです。

それからあなたは選びました。

于 2009-02-11T12:04:40.293 に答える
1

ファクトリ関数をクラス自体の静的メソッドとして持つことの利点は、それがそのクラスのライフサイクルの一部であることが明らかであることです。それを分離するということは、あなたのクラスを使用する他のプログラマーがファクトリメソッドを見つけるために別の場所を探す必要があることを意味します。

申し訳ありませんが、関数ポインターを factor メソッドに渡すことの正確な意味がわかりませんが、必要がなければ、通常は関数ポインターを使用しません。関数ポインタはコンパイル時に解決できないため、インライン化できません。つまり、処理が遅くなる可能性があります。しかし、それ以外に、コンパイル時に呼び出す関数がすでにわかっている場合に関数ポインターを使用するのは、設計が悪いように思えます。

于 2009-02-11T12:05:07.157 に答える
1

1 つの型に対して複数のファクトリが必要になることはありますか? その場合、ファクトリ オブジェクトが必要です。

于 2009-02-11T12:07:36.370 に答える