Facade
-
フランス語で「建物の正面」という意味
-
複雑な内部処理をまとめ、システムの外側に簡素化されたインターフェース(API)を提供するパターン
-
システムの内側にある各クラスの役割や依存関係を考えて、正しい順番でクラスを利用できるようにする
-
「カプセル化」を利用したパターン
-
クライアントからは
Facadeクラスで提供されたAPIのみが見える -
システム内部のクラス群を非常に大きなクラスと捉えると、
Facadeで提供されたAPIはメソッドに相当する -
システム内部のクラス群の状態や構造、複雑さを隠蔽している
メリット・デメリット
メリット
- その他クラスの構成要素を隠蔽することができる
- その他クラスと食らう案との結びつきを弱くする
デメリット
Facadeクラスがその他クラスの全てに結合されたゴッドクラスになる可能性がある
用途
- 複雑なサブシステムの一部の機能を使用する場合
- クライアントが内部構造を知らなくてもシンプルなAPIで機能を利用できる
- 複数のクラスの処理を呼び出す一連のコードが色々な箇所に書かれている場合
デザインパターンの種類
構造に関するデザインパターン
例(Mermaid)
FacadeClientに高レベルでシンプルなインタフェースを提供する- システム内部のクラス同士の関係を知っている
- 実際の処理はシステム内部のクラスに移譲する
- その他のクラス
- それぞれの機能を持っている
Facadeのことは意識しないFacadeを呼び出すことはない
classDiagram class Facade{ } class Client { } class Class1 { } class Class2 { } class Class3 { } class Class4 { } Facade <-- Client Class1 <-- Facade Class2 <-- Facade Class3 <-- Facade Class4 <-- Facade Class5 <-- Facade Class2 <--> Class3
商品の注文を行う例
ClientからはOrderクラスのplaceOrderのみを呼び出せば良い
classDiagram class Client { } class Order { placeOrder(name string) } class Invoice { sendInvoice(name string) } class Payment { makePayment(name string) } class Product { getProduct(name string) } Order <-- Client Invoice <-- Order Payment <-- Order Product <-- Order