Facade パターン

Facade パターンの最新ニュースをまとめて検索!

Facade パターンあるいは Façade パターン(ファサード・パターン)とは、GoF(Gang of Four; 4人のギャングたち)によって定義された、コンピュータソフトウェアデザインパターンの1つである。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 である。 CarDriver の各種メソッドの呼び出しが DrivingSimulator#simulate() の中にすべて集約されている。

なお、CarDriver にアクセス修飾子がついていないのは、これらのクラスを DrivingSimulator からしか使用できないようにするためである。詳しくは「効率的な情報の隠蔽」の節を参照のこと。

[編集] 用途

Facade パターンは主に以下の用途に使用される。

[編集] プログラムの抽象化

複雑な処理をソースコードに直接書く代わりに Facade クラスに任せることにより、構造を抽象化することが出来る。その結果

  • ソースコードの見通しが良くなる。
  • 処理の内容に手を加える場合、Facade クラスのみを編集すれば良い。

などの利点が生まれる。

[編集] 重複する処理の共通化

プログラム中に同じような処理が複数の箇所に存在する場合、それらの処理を Facade クラスに行わせることによって重複を無くすことが出来る。 また、Facade クラスをTemplate Method パターンとして設計し、共通の処理を親クラスに、異なる処理をサブクラスに実装するという差分プログラミングへの応用も可能である。

[編集] 効率的な情報の隠蔽

Java では、修飾子を付けないクラスやメソッドは同じパッケージ内からしかアクセスできないようになる。これを「パッケージプライベート」と呼ぶ。 それを利用して、Facade クラスに使われる各クラスをデフォルトアクセス宣言(修飾子無し)にしておき、Facade クラスのみを public 宣言にしておくことで、効率的に情報を隠蔽できる。 適用例のソースコードがその実例である。

[編集] 関係するパターン

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

[編集] 関連項目

最終更新 2009年9月15日 (火) 16:22 (日時は個人設定で未設定ならばUTC)。
【Facade パターン】変更履歴

ご利用上の注意