2011-08-21 14 views
5

私はC++の開発と設計に新しく、事前に曖昧な、またはあまり構造化されていないことをお詫びします。私はコード内にいくつかの明確で無関係な階層を持っています。これらの階層からオブジェクトをインスタンス化するために、Alexandrescuが記述し実装している汎用のファクトリを使用したいと考えています。
私が問題を抱えている部分は、初期化フェーズです。クラスの初期化のニーズは非常に異なります。場合によっては、初期化に必要なデータをストレージ(DB)から検索することができます。その場合、特定のクラスのInit()メソッドで初期化プロシージャをカプセル化できます。しかし、他の時間には、データはインスタンス化の瞬間にローカルにしか知られておらず、手動でオブジェクトに渡す必要があります。私はこれを行うための統一的な方法を考え出すのに苦労している。この種の問題に近づいている人はいますか? ありがとうC++でのオブジェクトの初期化とオブジェクトファクトリ

+0

Alexandrescuはポリシーのファンでもあり、工場の割り当てポリシーを持つことができます。しかし、具体的な割り当ての必要性がランタイムデータに依存する場合は、ランタイムスイッチングアロケータを回避することはできません。おそらく、アロケータコールバックのコレクションを登録してください... –

+0

は、単にこれらの問題を避けるために工場を使用しないでください。工場はいくつかの問題を解決することができますが、実際にはめったに必要とされません。 –

+0

返事をありがとう。 「実行時切り替えアロケータ」が意味することを説明してください。 – stas

答えて

4

あなたは、オーバーエンジニアリングハイウェイ...を先に駆け抜けています。

工場はめったに必要ではなく、2つの工場は(あなたが気づいたように)同じではありません。

この基本クラスには明確な意味がないため、すべてのファクトリに基本クラスを提供することは無意味です。それは何を構築するのですか? BirdCar?彼らは無関係です... Object?これはJavaではありません!

ファクトリ(何らかの理由で)を使用する場合は、Factoryは種類のオブジェクトを生成する必要があります。すべて共通の基本クラスから派生しています。いくつかの種類のオブジェクトがある場合、いくつかの種類のファクトリが必要になります。

ファクトリコードが繰り返し表示される場合は、テンプレートを使用して共通コードをホイストします。

0

私が正しく推測した場合、問題は、ファクトリメソッドに異なる引数セットを渡す方法がわからないことです。そのような場合は、もう1つの階層を作成するようにアドバイスできます。/それをFactoryHelperと呼ぼう。この階層の具体的なクラスには、具体的なクラスのインスタンス化のための特定のデータが含まれます。たとえば、ConcreteProductAのFactoryHelperAには文字列が含まれ、ProductBのFactoryHelperBにはintが含まれます。ファクトリのabstactメソッドは抽象基本クラス - FactoryHelperを引数として受け入れる必要があります。あなたの工場の具体的なメソッドは、この引数を具体的なFactoryHelperAまたはFactoryHelperBにキャストし、特定の製品のインスタンス化のための特定のデータを取得します。

しかし、それはあまり良いデザインではありません。私は間違った方法でファクトリメソッドを使用しようとしていると思います。

関連する問題