2012-05-02 7 views
3

これは正当な工場であるかどうかわかりません。だから、基本的には対象となる工場をチェックするための条件は、呼び出し元のコードに右であるC#ファクトリを作成する

if(//something) 
    factory = new Type1Factory(); 
else 
    factory = new RegularFactory(); 

そして、彼らはfactory.Create();

のように行くことによって、オブジェクトを作成します。ほとんどの工場の私は、クライアントでこのようなものを持って見ます。私はそれを隠すことを望み、ファクトリー自体の状態を保つことを望んでいます。それはもはや工場と呼ばれることはないでしょうか?このような

何か:

DateScheduleRequest request = new DateScheduleRequest(); 
DateScheduleBuilder dateScheduleBuilder = new DateScheduleBuilderFactory(request).Create(); 

そしてdateScheduleBuilderオブジェクトは、基本的には、工場出荷時のコンストラクタに送信された要求に応じて、特定のタイプであろう。

これに対して別のパターンがありますか、これはちょうど工場を行う特定の方法ですか?

基本的にDateScheduleBuilderは、他の種類のビルダーが継承している親クラスですが、私の呼び出しコードでは、この抽象クラスには1つのメソッドがあり、要求の型を認識する必要はありません。それを工場に渡して1つのメソッドを呼び出す必要があるという事実だけです。

+0

は、これは完全に罰金鳴り、GoFの –

答えて

2

私はあなたが2番目の部分に工場のパターンを記述していると思います。最初の部分は、呼び出し元が目的のオブジェクトを構築する方法を知っているためではありません。 あなたの例では、DateScheduleBuilderFactoryrequestオブジェクトの情報を解釈し、DateScheduleBuilderから派生したオブジェクトを返す方法を知ることができます。

要するに、Johm Domが上記のように。あなたはすでにそこにいます...

+1

はいに従って、完全に合法的な工場です。私の読書では、@ slandauは、 'DateScheduleBuilder dateScheduleBuilder'がその基本タイプ' DateScheduleBuilder'とまったく同じではないと考えると、カウントしません。しかしそれはそうです。 –

1

まず、最初のスニペットは完璧です。私はむしろ機能を追加したり、リファクタリングするよりもバグを修正したりする時間を費やしたいと思っています。

このコードをゼロから設計する場合、ifなどを非表示にします。コンストラクタで。経験則としては、「図書館が消費者のために何かを容易にすることができるときは、必ずそれを行うべきです」。

第3の選択肢は、if文をvtable-polymorphismに移動することです。

+0

私はコンストラクタでIFを隠すのが好きで、簡単な生活のために多態性の振る舞いを使用します。 – Turbot

1

あなたが持っているものは大丈夫です。

代替手段として、工場出荷時の設定があります。ですから、要求に基づいて、工場の実装を取得するメソッドを持つクラスを持っている(IDateScheduleBuilderFactory GetDateSceduleBuilderFactory(request)のようなものとは、消費者が

その少し複雑。ビルダーオブジェクトを取得するためにIDateScheduleBuilderFactoryCreate()を呼び出しますが、あなたが持っている意味します単一の責任を持つ単一のクラス(つまり、要求が正しいタイプの工場に、そして他のクラスが実際の異なるタイプの工場になるようにする1つのクラス)、これをより簡単にテストすることができます。特定の要求があった場合に、正しいタイプのファクトリが使用されていることをテストするつもりですが、GetDateSceduleBuilderFactory()メソッドによって返された型をチェックするのではなく、createの結果でこれを判断する必要があります。

public bool CanHandleRequest(request)のようなメソッドを公開して、各ファクトリが特定の要求に対して正しいファクトリであるかどうかを判断できるようにすることもできます。次に、ファクトリファクトリはそのコンストラクタでファクトリのコレクションを受け入れることができます。 GetDateSceduleBuilderFactory(request)メソッドは、要求を処理できるかどうかを尋ねるすべてのファクトリをループし、返すことができるファクトリを見つけたときに呼び出すことができます。

これは、新しいファクトリを追加するときにロジックを変更する必要がないという利点があります。リフレクションによってインターフェイスを実装するすべてのファクトリを取得し、新しいファクトリを追加するときに、自動的にピックアップされます。

0

厳密に言えば、どのタイプのオブジェクトを作成するかを決めるのにタイプを使用しないため、ファクトリーではありませんが、ヘッドファーストデザインパターンブックがシンプルファクトリーと呼ぶような共通の(有用な)イディオムです。 。

(戦略を作成する場合など)、それが正しい場所に私の見解では完全に合法だし、非常に便利な、

関連する問題