Facade パターン

Facade パターンあるいは Façade パターン（ファサード・パターン）とは、GoF（Gang of Four; 4人のギャングたち）によって定義された、コンピュータソフトウェアのデザインパターンの1つである。Facade（ファサード）とは「建物の正面」を意味する。異なるサブシステムを単純な操作だけを持ったFacadeクラスで結び、サブシステム間の独立性を高める事を目的とする。

概要
Facadeパターンの例として、サブシステムとしてのコンパイラーを考える。システムとしてのコンパイラーは字句解析器や構文解析器などから構成されている。これらの構成要素は、新たなコンパイラーやその他ソフトウェアを作成する上でサブシステムとして利用することが出来る。しかし、一般ユーザーにとってコンパイラーはソースコードからプログラムを生成するためのものであり、ソースコードをコンパイルできる機能があれば十分である。そこでサブシステムから一般ユーザーのために一般ユーザーが必要としているコンパイル機能だけを呼び出すクラスを提供する。ここで提供されたコンパイル機能を持つクラスがFacadeクラスである。Facadeクラスが提供された事により一般ユーザーはサブシステムの詳細を知る必要がなくなり、サブシステムの実装から解放されるのである。

Facadeパターンの要件
Facadeクラスはあくまでサブシステム内部に仕事を投げるだけで複雑な実装は持たない。
多様な機能の塊であるサブシステムから、サブシステムを利用するユーザーの用途に合わせた窓口(インターフェース)を提供するだけである。
Facadeクラスをサブシステム自体が利用する事はない。
Facadeクラスはあくまでサブシステム末端の窓口であるため、同じサブシステムから利用される事はない。
Facadeパターンはサブシステムの直接使用を妨げない。
Facadeクラスの利用は強制ではなく、必要であればサブシステムの機能を直接利用できる。言語によっては無名名前空間やPackageスコープによりサブシステムを利用者から隔離できるが、Facadeパターンはそのような制限はしない。

 クラス図 
Facade パターンのクラス図を以下に挙げる。

500px|center

 適用例 
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() の中にすべて集約されている。

 関係するパターン 
Abstract Factory パターンAbstract Factory パターンは Facade パターンの具体例と言える。ConcreteFactory クラスが Facade クラスに相当する。

 関連項目 
デザインパターン
パッケージ (Java)

Category:デザインパターン (ソフトウェア)