Facade

  • フランス語で「建物の正面」という意味

  • 複雑な内部処理をまとめ、システムの外側に簡素化されたインターフェース(API)を提供するパターン

  • システムの内側にある各クラスの役割や依存関係を考えて、正しい順番でクラスを利用できるようにする

  • 「カプセル化」を利用したパターン

  • クライアントからはFacadeクラスで提供されたAPIのみが見える

  • システム内部のクラス群を非常に大きなクラスと捉えると、Facadeで提供されたAPIはメソッドに相当する

  • システム内部のクラス群の状態や構造、複雑さを隠蔽している

メリット・デメリット

メリット
  • その他クラスの構成要素を隠蔽することができる
  • その他クラスと食らう案との結びつきを弱くする
デメリット
  • Facadeクラスがその他クラスの全てに結合されたゴッドクラスになる可能性がある

用途

  • 複雑なサブシステムの一部の機能を使用する場合
    • クライアントが内部構造を知らなくてもシンプルなAPIで機能を利用できる
  • 複数のクラスの処理を呼び出す一連のコードが色々な箇所に書かれている場合

デザインパターンの種類

構造に関するデザインパターン

例(Mermaid)

  • Facade
    • Clientに高レベルでシンプルなインタフェースを提供する
    • システム内部のクラス同士の関係を知っている
    • 実際の処理はシステム内部のクラスに移譲する
  • その他のクラス
    • それぞれの機能を持っている
    • 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