2011-07-16 13 views
1

私はいくつかの長いメソッドをリファクタリングする必要があります。db/service呼び出しを行う工場クラス

私たちのアプリでは、一連のドキュメントを作成しています。すべて同じ種類で、アプリ内の値から得られた値が異なります。そのコードはすべてヘルパークラスになっていますが、ファクトリクラスを使用してドキュメントを生成したいと考えています。ファクトリは、Aの場合はfactory.getDocument("A")と、Bの場合はfactory.getDocument("B")を呼び出します。

私の問題は、私のデータベースから値が必要で、サービスが工場クラスに含まれないようにどこか(または誰かが私に助言した)を読んでいるということです。この場合、完全なオブジェクトをどのように構築するのですか?

私のファクトリクラスでservice/db呼び出しを行うことは許されますか?

もしそうでない場合は、オブジェクトを構築するために必要な値(例:factory.getDocument(a,b,c,d)またはinputobject)の引数を渡す必要がありますか?これは、呼び出し元が文書Aの作成方法に関する情報を必要とするため、このアプローチを避けることを望んでいるので、ファクトリクラスを持つという目的を破るようです。私は呼び出しメソッドがドキュメントの作成方法について何も知らないことを望みます。

私のオプションは何ですか?

答えて

0

質問を編集したので、回答を変更します。

発信者がそれらを作成するためのパラメータを知らないようにするには、コード内の何かがドキュメント "A"と "B"の意味を理解する必要があります。ロジックがあなたの工場に含まれていない、あるいは少なくとも工場が "A"と "B"を作り出す方法を調べる責任がある理由はありません。それは工場パターンにとって非常に賢明です。

それでも、接続を取得するだけであっても、シングルトンを介してdbにアクセスすることができます。参照:Java Singleton Pattern

+0

最近の[Singleton Antipattern](http://caines.ca/blog/programming/singletons-anti-pattern-or-worst-anti-pattern-ever/)も参照してください。 –

+0

Meh - 問題がありますシングルトンは、特にオブジェクトの寿命とそれに含まれるリソースに関連して、何かを終了させるときにシングルトンを破棄することが設計上の問題になる可能性があります。しかし、私はこの記事のいくつかの議論に強く反対しています。アクセス/機能を許可または制限するコードを記述するたびに、それがカプセル化の前提です。シングルトンには場所がありますが、他のタイプのオブジェクトと同様にライフサイクルを尊重する必要があります。 – iandotkelly

1

私は工場からデータベースにアクセスしても問題はありません。 Factoryの目的は、何らかの入力に基づいてオブジェクトを生成することです。だから、もし入力がデータベースから来たら?

+0

主な注意点は、サービス - >ファクトリ - >サービスのようなオブジェクトグラフのサイクルを作成することです。 –

0

私は、Factoryパターンを使用して同じクラスを作成し、別のデータを設定するというアイデアには少し違っています。いくつかの基準に従ってJavaクラスを作成し、それを移入することは異なる懸念事項であり、したがって、別々のエンティティによって処理されます。

理想的には、Factoryクラスは、ある種のユーザー入力に基づいて正しいエンティティをインスタンス化することのみを担当します。あなたの例では、異なる種類のDocumentクラスの実装がある場合、Factoryクラスのみを使用すると言います。 Populate Documentクラスは別のエンティティによって処理されます(必要に応じてシングルトンになります)。

0

セパレーションでは、抽象的なファクトリパターンを使用し、ドキュメントタイプに基づいて正しいパターンを選択する必要があります。

関連する問題