デザインパターン学習メモ:「Facade」


このパターンの目的

GoF本より引用する。

サブシステム内に存在する複数のインタフェースに1つの統一インタフェースを与える。Facadeパターンはサブシステムの利用を容易にするための高レベルインタフェースを定義する。(P.197)

多数のクラスが依存し、それぞれが依存関係をもつような複雑なシステム(ライブラリ)があったとする。このシステム(ライブラリ)の利用者は、システムの内部(クラス構造)を知り、それらのクラスを組み合わせて目的を達成しなければならない。

複数の利用者がいた場合、それぞれが複雑な構造を理解しなければいけない状態は、なかなか辛い。

そこで複雑なシステム側に新たにインタフェース(クラス)を作成し、利用者はそのクラスのメソッドを呼びだせば大抵の目的を達せられるようにする。

もともとあったクラス群については隠蔽せず、そちらを使いたい人は使えばよい。

しかし、多くの利用者は新たに作成されたインタフェースを用いるだろう。

実装例

サンプルコードは割愛する。(他のパターンと比べるとシンプルで理解しやすいため)

Facadeパターンの実装方法はシンプルで、利用者が使うクラス(統一的なインタフェースを示す。Facade役)を1つ作ればよい。

このFacade役のクラスは、「実際の処理を担当する各クラス」への参照を持ち、「委譲」を用いて処理を進める。反対に、「実際の処理を担当する各クラス」からFacade役クラスへの参照を持つことはない。

利用例

GoF本のコンパイラサブシステムの例がわかりやすい。

「Scannerクラス」、「Parserクラス」、「ByteStreamクラス」...などを組み合わせてコンパイル処理を実施する必要がある場合、「Compilerクラス」(Facade役)を作成し、そこに「compileメソッド」を実装する。

そうすると、利用者はこのメソッドを呼び出すだけで、各クラスの使い方やそのクラスの存在自体を知らなくても、容易にコンパイル処理を行える。

参考文献

  • エリック ガンマ、ラルフ ジョンソン、リチャード ヘルム、ジョン プリシディース(1999)『オブジェクト指向における再利用のためのデザインパターン 改訂版』本位田 真一、吉田 和樹 監訳、SBクリエイティブ