2016-04-08 13 views
0

私はJavaのプロキシパターンと呼び出しハンドラについて読んできましたが、どこでも具体的なクラス構造がクライアントに利用可能であることがわかりました。例えばプロキシパターンの具体的なクラスの隠蔽実装の詳細

//TwitterService service = (TwitterService) SecurityProxy.newInstance(new TwitterStub()); 
TwitterService service = new TwitterStub(); 
System.out.println(service.getTimelinePosts("abc")); 

ユーザが直接TwitterStubのインスタンスを作成して、メソッドにアクセスすることができます。私はクライアントを介して具体的なクラスの構築を避けたり避けたりする方法があるのだろうかと思っていましたか?

良い方法がありますか?

+0

InvocationHandlerの実装を提供する必要があります。他には何も必要ありません。 –

+1

[ファクトリメソッドパターン](https://en.wikipedia.org/wiki/Factory_method_pattern)または[抽象ファクトリパターン](https://en.wikipedia.org/wiki/Abstract_factory_pattern)を使用すると、あなたのコンストラクタの直接呼び出し。 – callyalater

+0

しかし、私はあなたの質問をよく理解しているとは思わない... – callyalater

答えて

1

GoFが述べるように、プロキシパターンの目的は、「別のオブジェクトに代理またはプレースホルダを提供して、そのオブジェクトへのアクセスを制御する」ことです。

具体的には、特定のプロキシインスタンスを直接作成している場合があります。特定のタイプのプロキシオブジェクトが必要であることを(クライアントとして)知っている限り、それは問題ありません。

インダイレクションのレベルが必要な場合は、さまざまな種類のプロキシオブジェクトを返す抽象ファクトリパターンを使用できます。しかし、今のところ、代理オブジェクトの理由は、他のオブジェクトに代わって行動することです。

副作用として、プロキシは、作成に費用がかかるオブジェクトがある場合に便利ですが、そのような費用のために主要なアプリケーション機能を必ずしも損なう必要はありません。たとえば、1000個のイメージを持つドキュメントがあるとします。プロキシを使用することができ、厳密に必要なときにのみロードすることができます(可視のビューにある場合)。また、1000個のイメージを一度に読み込むオーバーヘッドなしに完全なドキュメントを本当に高速に読み込むことができます。

関連する問題