🐿️

【デザインパターン】ファサードパターン - Facade

2021/06/22に公開

ファサードパターンとは、GoF(Gang of Four)デザインパターンの一つで、複雑になっている複数のクラスをまとめ、使いやすい形にして外部に提供する方法です。その複数のクラスのまとめ役が、窓口といわれるFacadeです。

ファサードパターンのコード

以下は「Subsystem1です Subsystem2です」の文字列を出力するサンプルコードです。

このコードでの複数のクラスは、Subsystem1とSubsystem2クラスを指します。それらをFacadeクラスにまとめて、外部に提供します。

class Facade {
  protected subsystem1: Subsystem1
  protected subsystem2: Subsystem2

  constructor(subsystem1: Subsystem1, subsystem2: Subsystem2) {
    this.subsystem1 = subsystem1 || new Subsystem1()
    this.subsystem2 = subsystem2 || new Subsystem2()
  }

  public operation() {
    return `${this.subsystem1.operation()} ${this.subsystem2.operation()}`
  }
}

class Subsystem1 {
  public operation = () => 'Subsystem1です'
}

class Subsystem2 {
  public operation = () => 'Subsystem2です'
}

class Client {
  protected facade: Facade
  constructor(facade: Facade) {
    this.facade = facade
  }
  public output() {
    console.log(facade.operation())
  }
}

const subsystem1 = new Subsystem1()
const subsystem2 = new Subsystem2()
const facade = new Facade(subsystem1, subsystem2)
const client = new Client(facade)
client.output() // Subsystem1です Subsystem2です
  • Facade サブシステムの窓口となるクラスです
  • Subsystem1 Subsystem2 Facadeから呼び出されて処理を行います
  • Client Facadeが提供するメソッドを呼出し、処理を行います

メリット

  • 複数のサブシステム間の結合を減らすことができます
  • サブシステムはFacadeに処理を任せるため、サブシステム自身が実行順序を気にしなくて済みます
  • 複雑な内部処理(DB処理など)をFacadeが窓口になることで隠蔽でき、利用する側はその処理を使いやすくなります

参考

https://refactoring.guru/design-patterns/facade

Discussion