ファクトリ関数対ファクトリオブジェクト
-
22-08-2019 - |
質問
私は、いくつかの派生クラスでABCを持っています。私は工場出荷時のパターンを使用してこれらの派生クラスを作成するには:
.hファイル:
class derivedFactory
{
public:
base* createInstance();
};
.cppファイル:
base* derivedFactory::createInstance()
{
return new derived();
}
ちょうどフリー機能を持つ以上、これにどんな利点があります:
.hファイル:
base* derivedFactoryFunction();
.cppファイル:
base* derivedFactoryFunction()
{
return new derived();
}
も:私は、依存性注入のためのAbstract Factoryパターンを使用します。私はABCに基づいて継承階層を使用する場合があります:
class objectCreator
{
public:
base* create() = 0;
};
関数ポインタを介してこれを使用するすべての利点があります:
boost::function<base* ()> factory_ptr;
ブースト::バインド/ラムダを使用して、これは私のコードをより構成可能にするために、そして私が望むなら、私はそれに実際のファクトリオブジェクトをラップすることができそうです。私はわずかなパフォーマンスの低下があるかもしれないことを見ることができますが、これは、それが唯一の起動時に呼び出されたとして心配するくらいです。
解決
これはあなたの工場をする必要がありますどのように柔軟に依存します。工場は、オブジェクトが理にかなっているよりも、オブジェクトを構築する方法を決定するために(のような設定ファイル、プログラムオプション、などからの)外部の情報を必要とする場合。あなたが必要とするすべての機能は、おそらく大丈夫ですよりも、工場への引数である場合。
私はポインタを持つに見ることができる唯一の利点は、あなたが別の工場の機能を使用することができ、テストのためのものです。
他のヒント
単一メソッドまたはメソッドへのポインタとのインタフェースを持つことと等価である。
しかし、あなたはTHER最初のものと一緒に行くために別の方法をしたい場合は、2番目のケースでは、あなたがトラブルに巻き込まれるだろう...
そして、インターフェースは私の意見ではメソッドポインタよりも読みやすいです。
次に、あなたが選んだ。
私はクラス自体内の静的メソッドとして、工場の機能を有することの利点は、そのクラスのライフサイクルの一部であることは明らかであるということだと思います。それは分離作ることは、あなたのクラスを使用する他のプログラマがファクトリメソッドを見つけるためにどこかを見なければならないことを意味します。
私は、私はあなたが要因メソッドへの関数ポインタの周りに渡すことによって何を意味するかを正確にわからないごめんなさいだけど、あなたがする持っていない場合、私は一般的に関数ポインタを使用することはありません。彼らはおそらく遅くなる可能性を意味し、コンパイル時に解決することができないとして関数ポインタをインライン化することはできません。しかし、それ以外にも、ちょうどあなたがすでにあなたは、コンパイル時にコールするつもりだどの機能で確認することができた場合に悪いデザインは、関数ポインタを使用しているようだ。
あなたは今までのタイプのための複数の工場をしたいですか?もしそうなら、あなたは工場出荷時のオブジェクトを必要としています。