Facade パターンあるいは Façade パターン(ファサード・パターン)とは、GoF(Gang of Four; 4人のギャングたち)によって定義された、コンピュータソフトウェアのデザインパターンの1つである。Facade(ファサード)とは「建物の正面」を意味する。異なるサブシステムを単純な操作だけを持ったFacadeクラスで結び、サブシステム間の独立性を高める事を目的とする。
Facadeパターンの例として、サブシステムとしてのコンパイラーを考える。システムとしてのコンパイラーは字句解析器や構文解析器などから構成されている。これらの構成要素は、新たなコンパイラーやその他ソフトウェアを作成する上でサブシステムとして利用することが出来る。しかし、一般ユーザーにとってコンパイラーはソースコードからプログラムを生成するためのものであり、ソースコードをコンパイルできる機能があれば十分である。そこでサブシステムから一般ユーザーのために一般ユーザーが必要としているコンパイル機能だけを呼び出すクラスを提供する。ここで提供されたコンパイル機能を持つクラスがFacadeクラスである。Facadeクラスが提供された事により一般ユーザーはサブシステムの詳細を知る必要がなくなり、サブシステムの実装から解放されるのである。
Facade パターンのクラス図を以下に挙げる。
Java による適用例を以下に挙げる。
driving.Car
package driving; class Car{ private int speed; private int distance; Car(){ this.speed = 0; this.distance = 0; } void setSpeed(int speed){ this.speed = speed; } void run(int minutes){ this.distance += minutes * this.speed; } int getDistance(){ return this.distance; } }
driving.Driver
package driving; class Driver{ private Car car; Driver(Car car){ this.car = car; } void pushPedal(int speed){ this.car.setSpeed(speed); } void drive(int minutes){ this.car.run(minutes); } }
driving.DrivingSimulator
package driving; public class DrivingSimulator{ public void simulate(){ Car c = new Car(); Driver d = new Driver(c); d.pushPedal(700); d.drive(30); d.pushPedal(750); d.drive(20); System.out.println("The travel distance is " + c.getDistance() + " m."); } }
FacadeTest
import driving.DrivingSimulator; public class FacadeTest{ public static void main(String[] argv){ new DrivingSimulator().simulate(); } }
このソースコードの場合、クラス図の Facade にあたるのは DrivingSimulator である。 Car や Driver の各種メソッドの呼び出しが DrivingSimulator#simulate() の中にすべて集約されている。
Facade
DrivingSimulator
Car
Driver
DrivingSimulator#simulate()
ConcreteFactory