Facadeパターンの解説

Facadeパターンとは、複雑なシステムの操作を簡単にするために、シンプルなインターフェースを提供するデザインパターンだ。これにより、システム内部の複雑さを隠して、使いやすいAPIを提供することができる。

たとえば、家電製品を一つのリモコンで操作できるようにするのがこのパターンだ。

では、サンプルコードを一緒に見ていこう。

解説

例えば、複雑な家電製品(テレビ、スピーカー、ゲーム機など)を一気に操作できるリモコンを作ると考えてみてほしい。リモコンを押すだけで、家中の電化製品が正しい順番で動くようにしよう。この「リモコン」がFacadeパターンの例なんだ。

Step 1: 家電製品の個別クラスを作る

まず、家電製品(テレビ、スピーカー、ゲーム機)をそれぞれ個別に操作するクラスを作ってみよう。それぞれには、電源を入れるメソッドを用意するよ。


// テレビクラス
class TV {
  on() {
    console.log("テレビの電源を入れました。");
  }
}

// スピーカークラス
class Speaker {
  on() {
    console.log("スピーカーの電源を入れました。");
  }
}

// ゲーム機クラス
class GameConsole {
  on() {
    console.log("ゲーム機の電源を入れました。");
  }
}
      

Step 2: Facadeクラスを作る

次に、これらの家電製品を一度に操作する「リモコン」のようなクラスを作成しよう。このクラスがFacadeとして機能し、個別の家電製品をまとめて操作できる。


// Facadeクラス(リモコン)
class HomeTheaterFacade {
  constructor(tv, speaker, gameConsole) {
    this.tv = tv;
    this.speaker = speaker;
    this.gameConsole = gameConsole;
  }

  startMovie() {
    console.log("映画を開始します...");
    this.tv.on();
    this.speaker.on();
    this.gameConsole.on();
  }
}
      

Step 3: Facadeパターンを使って操作する

最後に、このFacadeクラスを使って、すべての家電を一度に操作してみよう。「startMovie」というメソッドを呼び出すだけで、すべての家電が動作する。


// 家電製品のインスタンスを作成
const tv = new TV();
const speaker = new Speaker();
const gameConsole = new GameConsole();

// Facadeクラス(リモコン)を作成
const homeTheater = new HomeTheaterFacade(tv, speaker, gameConsole);

// Facadeパターンを使って家電を一括操作
homeTheater.startMovie(); 
// 結果:
// 映画を開始します...
// テレビの電源を入れました。
// スピーカーの電源を入れました。
// ゲーム機の電源を入れました。
      

Facadeパターンの重要なポイント

これでFacadeパターンの解説は終わりだ。
このパターンを使うと、複雑なシステムの操作を簡略化し、外部からはシンプルな操作ができるようになるので、ユーザーにとって扱いやすい。