2011-02-03 8 views
6

私の質問は厳密に言語に関連しているわけではありませんが、より一般的なプログラミングの概念です。Factoryクラスの内部または外部にキャッシング機構を持たせる方が良いでしょうか?

私は、Parserオブジェクトを返すメソッドを持つFactoryクラスを持っていて、これらのパーサークラスは繰り返しのサイクルごとに(もちろん工場外で)インスタンス化する必要はありません。

ファクトリ内部のすべてのインスタンス化されたパーサーのキャッシュメカニズムを作成するために、使用方法とオブジェクト分離の点でより優れています。つまり、メソッド呼び出し中、メソッド呼び出し中、メソッドが既に呼び出されているとき?

ありがとうございます。

答えて

5

Factoryのインターフェイスを定義し、複数の実装を実装することもできます.1つの実装では、内部でキャッシングを実行してParserクラスが1回インスタンス化されることが保証されます。別の実装ではキャッシングを実行せず、何かを求めるときはいつでも新しいParserオブジェクトを提供することができます。

どちらの方法でも、このロジックをFactory実装内に保存し、残りのアプリケーションをFactoryインターフェイスで使用することをお勧めします。この方法で後で何かをキャッシュしたくない、またはParserをインスタンス化する方法を変更する必要があると判断した場合は、Factoryの中に単一のオブジェクト作成ポイントしかありません。これにより、Parserオブジェクトを構築する方法を変更することが簡単になります。新しいオブジェクトを追加する場合は、Parserが必要です。

もう一度 - Factoryの外部で動作するキャッシングメカニズムを作成すると、新しいParserを取得する必要があるときにいつでもそれらのメカニズムを使用する必要があるため、これらのメカニズムはすべてコードになります。後でキャッシング機構を変更する場合は、多くのコードに触れる必要がありますが、Factoryの内部でキャッシュする場合は、Factoryの実装を変更するだけです。

+0

[独責の原則](http://en.wikipedia.org/wiki/Single_responsibility_principle) –

+0

@Tom Brito:私は原則を理解していますが、この状況にどのように適用されるのか説明する必要があります。 –

+0

実際、私はあなたの答えを見る人にそれを投稿しました。特にあなたのためではありません。この原則は、彼のクラスがすでに持っている責任を1つ以上持たなければならないかどうかを質問している状況に適用されます。この原則に従うことで、答えはいいえ、キャッシング・メカニズムは別のクラスの外に置く必要があります。確かにそれは彼のプロジェクトに深く依存するでしょうが、もし彼がパターンを追いたいなら、これは良いものかもしれません。 –

0

あなたが使用する必要があるように私に聞こえる音はSingleton Patternです。

+0

シングルトンは単一のインスタンスオブジェクトです。私はキャッシュされた方法で多くのオブジェクトの単一のインスタンスを管理する必要があります...シングルトンをパーサーに使用しても、キャッシュが必要です。 – OverLex

+0

@Lexパーサオブジェクトのシングルトンパターンを使用してそれらをキャッシュし、ファクトリがファクトリの必要なものすべてのシングルトンインスタンスを返すようにします。 – Becuzz

+0

@Becuzzなぜファクトリーを通過するのではなく、シングルトンを直接参照するのはなぜですか? – Caelum

0

Shakedownが述べたように、1つのアプローチは、インターフェイスに対して作業し、キャッシング実装と別の非キャッシング実装を提供することです。これは、いくつかの状況で少し面倒になることがあります(あなたのアプリは本当に2つの異なる実装を必要としますか?)。

このようなクラスが多数ある場合は、プロキシパターンを使用することを検討してください。 Proxyクラスは、Factory実装と同じインタフェースを実装し、Factoryから返されるオブジェクトがProxyのキャッシュにない場合にのみ、ファクトリに委譲します。

ダイナミックプロキシを使用すると、このアプローチが拡張され、ライブラリの膨大な追加がなくても(ただし、複雑さは増しますが)キャッシングを実装できます。

2

私は問題を理解していません。ファクトリクラスのクライアントは、受け取ったオブジェクトがキャッシュされているかどうかは気にしません。キャッシングロジックが工場に属している必要があります。

さらに、これを実装するときは、何かを速く動かすために、キャッシングなしでファクトリを実装してください(で動作する可能性が最も簡単なものを実行してください)。次に、キャッシュを実装します。それ以外の場合は早期最適化の場合です。クライアントクラスがオブジェクトがキャッシュされているかどうかを知る必要がある場合、開発プロセスは迅速に腐敗します。

どのように実装するかはあなた次第です。私は一般的なキャッシュクラスを作成し、このような状況で再利用するのが好きですが、他のメカニズムについて考えることができます。また、私はjavaをしていないので、ここで何が良いかについて述べることはできません。

(PS:この質問の回答には、デザインパターンのノイズがたくさんありますが、これはJavaの人々の間では常にパターンの考え方ですか?設計するシングルトンや、どのインタフェースが変更できないかについての単純な推論のみ)。

+0

私がすでに言ったように、最初の実装はキャッシュなしであったので、私は現在、最適化の一形態としてキャッシュを導入しており、どのアプローチが最善であるべきか不思議でした。 はい、パターンを考えることはJavaの世界では一般的です。それは私たちすべてを幸運にもそうでもなく形作った4つのギャングです: – OverLex

+0

@Lex:私のために、デザインパターンは常にあなたが思いついた言語サポートが不足している場合は、自分自身または回避策を使用してください。パターンを乱用することは、あなたのプログラマをプログラムに変えることです。しかし、彼らはあなたが良いデザインの練習をするのを助けることができます。私は、「Java学校」(フランスでは、最も激しいプログラミング学校がJavaを教えるため、私の根源的なJavaについての偏見)があなたの思考を避けようとしていると感じています。 –

関連する問題