ファサードパターン( façadeとも表記) は、オブジェクト指向プログラミングでよく使用されるソフトウェア設計パターンです。建築におけるファサードに似ており、より複雑な基礎コードや構造コードをマスクする前面のインターフェイスとして機能するオブジェクトです。ファサードは次のことが可能です。
- より複雑なコンポーネントとのやり取りを単一の(多くの場合は簡略化された)アプリケーションプログラミングインターフェース(API)の背後に隠すことで、ソフトウェアライブラリの読みやすさと使いやすさを向上させます。
- より一般的な機能へのコンテキスト固有のインターフェースを提供する(コンテキスト固有の入力検証を含む)
- モノリシックまたは密結合のシステムを、より疎結合のコードにリファクタリングするための出発点として機能する
開発者は、システムが相互依存するクラスが多数あるため、またはソース コードが利用できないために、システムが非常に複雑または理解しにくい場合に、ファサード デザイン パターンを使用することがよくあります。このパターンは、大規模なシステムの複雑さを隠し、クライアントに簡単なインターフェイスを提供します。通常、クライアントに必要なメンバーのセットを含む単一のラッパー クラスが含まれます。これらのメンバーは、ファサード クライアントに代わってシステムにアクセスし、実装の詳細を隠します。
概要
ファサード [1]デザインパターン は、 柔軟で再利用可能なオブジェクト指向ソフトウェア、つまり実装、変更、テスト、再利用が容易なオブジェクトを設計するために、繰り返し発生する設計上の問題を解決する方法を記述した、よく知られている23のGoFデザインパターンの1つです。
ファサードデザインパターンはどのような問題を解決できるでしょうか? [2]
- 複雑なサブシステムを使いやすくするには、サブシステム内の一連のインターフェースに対してシンプルなインターフェースを提供する必要があります。
- サブシステムへの依存関係は最小限に抑える必要があります。
複雑なサブシステムに直接アクセスするクライアントは、異なるインターフェースを持つ多くの異なるオブジェクトを参照(依存)します(密結合)。そのため、クライアントの実装、変更、テスト、再利用が困難になります。
Facade デザイン パターンはどのようなソリューションを表しますか?
Facadeオブジェクトを
定義する
- サブシステム内のインターフェースに関して(委任することによって)単純なインターフェースを実装し、
- リクエストを転送する前/後に追加の機能を実行する場合があります。
これにより、オブジェクトを介して作業し、Facadeサブシステムへの依存性を最小限に抑えることができます。
以下の UML クラス図とシーケンス図も参照してください。
使用法
ファサードは、基礎となるオブジェクトへのより簡単なインターフェースが必要な場合に使用されます。[3]また、ラッパーが特定のインターフェースを尊重し、ポリモーフィックな動作をサポートする必要がある場合は、アダプタを使用できます。デコレータを使用すると、実行時にインターフェースの動作を追加または変更することができます。
ファサードパターンは、通常、次のような場合に使用されます。
- 複雑なシステムにアクセスするにはシンプルなインターフェースが必要です。
- システムが非常に複雑であったり理解しにくい場合、
- 階層化されたソフトウェアの各レベルにエントリポイントが必要である、または
- サブシステムの抽象化と実装は密接に結合されています。
構造
UML クラス図とシーケンス図
このUML クラス図では、Clientクラスはサブシステム クラスに直接アクセスしません。代わりに、クラスはサブシステム クラス ( 、、および)に関して (委任することによって) 単純なインターフェイスを実装するクラスClientを介して機能します。 は単純なインターフェイスのみに依存し、複雑なサブシステムからは独立しています。[4]FacadeClass1Class2Class3ClientFacade
シーケンス図は、実行時の相互作用を示しています。オブジェクトは、要求を実行する、、および
インスタンス
に要求を委任するオブジェクト Clientを通じて機能します。FacadeClass1Class2Class3
UML クラス図
- ファサード
- ファサード クラスは、パッケージ 1、2、および 3 をアプリケーションの残りの部分から抽象化します。
- クライアント
- オブジェクトはファサード パターンを使用してパッケージのリソースにアクセスします。
例
これは、クライアント (「あなた」) が複雑なシステム (CPU やハードドライブなどのコンピュータ内部の部品) のファサード (「コンピュータ」) と対話する方法の抽象的な例です。
C++
構造体 CPU { void Freeze (); void Jump ( long position ); void Execute (); };
構造体HardDrive { char * Read ( long lba , int size ); };
構造体Memory { void Load ( long position , char * data ); };
クラスComputerFacade { public : void Start () { cpu_ . Freeze (); memory_ . Load ( kBootAddress , hard_drive_ . Read ( kBootSector , kSectorSize )); cpu_ . Jump ( kBootAddress ); cpu_ . Execute (); }
private :
CPU cpu_ ;メモリmemory_ ;ハードドライブhard_drive_ ; };
int main () { ComputerFacadeコンピュータ;コンピュータ.Start () ; }
参照
参考文献
- ^ Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides (1994)。デザインパターン: 再利用可能なオブジェクト指向ソフトウェアの要素。Addison Wesley。pp. 185ff。ISBN 0-201-63361-2。
{{cite book}}: CS1 maint: 複数の名前: 著者リスト (リンク) - ^ 「ファサード デザイン パターン - 問題、解決策、適用性」。w3sDesign.com。2017年8 月 12 日閲覧。
- ^ フリーマン、エリック; フリーマン、エリザベス; シエラ、キャシー; ベイツ、バート (2004)。 ヘンドリクソン、マイク; ルーキデス、マイク (編)。 Head First Design Patterns (ペーパーバック)。 第 1 巻。 O'Reilly。 pp. 243、252、258、260。ISBN 978-0-596-00712-6. 2012年7月2日閲覧。
- ^ 「ファサードデザインパターン - 構造とコラボレーション」w3sDesign.com . 2017年8月12日閲覧。
外部リンク
- ポートランドパターンリポジトリからの説明
