Facadeパターンとは
facade(ファサード)とは「建物の正面」という意味で窓口としての役割を果たします。
Facadeの役割を果たすクラスやメソッドがシステムの内側にある各クラスの役割や依存関係を考えて、正しい順番でクラスを利用するため、システムの外側(呼び出し元)からするとシンプルなインターフェースとなります。

Facadeパターンで登場する概念
クライアント
Facadeの呼び出し元です。
Facade
下に出てくるその他大勢のクラスやメソッドの窓口として機能します。
システムを構成しているその他大勢
それぞれ様々な仕事をするクラスやメソッドで、Facadeの役目をするクラスやメソッドから呼び出されることはあっても、呼び出すことはありません。
簡単なコードを書いてみる
その他大勢
いろいろな処理をするクラスをずらずらと。
これらをクライアントで呼び出すときに、クライアントからすべて呼び出すのか、間に窓口となるクラスを作るのかどうかが今回のFacadeパターンを使うかどうかの違いです。
class Test1
{
public function doSomething()
{
echo 'test1';
}
}
class Test2
{
public function doSomething()
{
echo 'test2';
}
}
class Test3
{
public function doSomething()
{
echo 'test3';
}
}
Facade
窓口となるクラスを作成します。
この中で呼び出したい各メソッドを呼び出し、順番を決めているため、あとはこのメソッドを呼び出すだけです。
class Facade
{
private $test1;
private $test2;
private $test3;
public function __construct()
{
$this->test1 = new Test1();
$this->test2 = new Test2();
$this->test3 = new Test3();
}
public function run()
{
$this->test1->doSomething();
$this->test2->doSomething();
$this->test3->doSomething();
}
}
クライアント
呼び出し元でFacadeクラスのメソッドだけを呼び出しています。
Facadeクラスを使用しない場合には、こちらから各クラスを呼び出すことになります。
Facadeクラス一つを呼び出すだけに比べると、インターフェースの数が多くなりどの順番で呼び出すかなどもこちらで考慮する必要が外部との結合が密になります。
class Client
{
private $facade;
public function __construct()
{
$this->facade = new Facade();
}
public function run()
{
$this->facade->run();
}
}
実務で使っている場面
昔コントローラーが肥大化してしすぎて手に負えなくなってしまったことがありました。
この時はコントローラーに処理を書きすぎてしまいました。
これは上記の例でいうとクライアントからその他大勢のクラスを呼び出している状況です。
呼び出し元を肥大化させないということと、どんな処理の流れで呼び出しているのかをわかりやすくするためにfacadeパターンの考えを使って、窓口となるメソッドを作成して対応しました。
今回のFacadeパターンはコントローラーを肥大化させないためにも重要な考え方となると思います。
メリット
Aメソッドの後にBメソッドを呼ばないといけないといったメソッドやクラス同士の関係性のような複雑化しやすいものを、呼び出し元からは単純に見せてくれます。
呼び出し元からFacadeの役割を果たすクラスやメソッドだけ見えている状態なので、インターフェースを少なくすることができ、外部との結合を疎にすることができます。
参考
Java言語で学ぶデザインパターン入門