プロキシとファサードは、アプリケーションのアーキテクチャを構成するための異なる問題を解決する構造的デザインパターンです。
プロキシは、オブジェクトの代理または「代替品」として機能します。その目的は、アクセスを制御し、キャッシュを実装し、遅延読み込みを実現し、安全性を調整し、リクエストを分散させることです(例:ネットワークプロキシ、セキュリティプロキシ)。プロキシは、実際のオブジェクトと同じ契約(インターフェース)を実装します。
Javaの例:
public interface Service { void operation(); } public class RealService implements Service { public void operation() { // ... } } public class ProxyService implements Service { private RealService realService = new RealService(); public void operation() { // アクセスチェック realService.operation(); } }
ファサードは、サブシステムの複雑さを隠し、単一の簡略化されたインターフェースを提供するパターンです。ファサードは、アクセス制御や補助ロジックは行わず、単に呼び出しを集約します。
Javaの例:
public class PaymentFacade { private CardService card; private SmsService sms; public void pay() { card.check(); card.charge(); sms.notify(); } }
いつ適用するか:
主な特徴:
ファサードパターンを使用してサブシステムの元のクラスに機能を追加できますか?
いいえ、ファサードは呼び出しを集約し簡略化するだけで、新しい機能は他のパターンまたは新しいサービスによって実装されます。
プロキシはターゲットオブジェクトからの継承を介して実装する必要がありますか?
いいえ、プロキシはターゲットのインターフェースを実装しますが、しばしば組み込み(実際のオブジェクトのカプセル化)が使用され、継承は使用されません。
ファサードを使用してアクセス制御またはエラーログを管理できますか?
そのためには、プロキシを使用する方が良いです。ファサードは、キャッシュ、ロギング、または権限チェックの組み込みサポートを目的としていません。