Facadeパターン(ファサードパターン)とは
Facadeパターンは、GoF(Gang of Four)によって定義されたデザインパターンの一つで、複雑なサブシステムに対して簡素化されたインターフェースを提供するものです。「Facade(
ファサード)」とは、建物の正面を意味し、このパターンが、システムの複雑さを隠蔽し、利用者に分かりやすい窓口を提供する役割を、建築物の正面に例えていることに由来します。
概要
Facadeパターンは、複数のコンポーネントからなるサブシステムを、より単純な操作を提供するFacadeクラスを通して利用できるようにします。これにより、サブシステムの複雑さを意識することなく、特定の機能を利用できます。
例として、コンパイラーをサブシステムとした場合を考えます。コンパイラーは、字句解析器や構文解析器など、複数のコンポーネントから構成されています。これらのコンポーネントは、他のコンパイラーや
ソフトウェアで再利用できるサブシステムですが、一般のユーザーにとっては、ソースコードからプログラムを生成できる機能があれば十分です。
そこで、Facadeクラスは、これらのサブシステムの機能をまとめて、一般ユーザーがコンパイル機能だけを利用できるようにします。このFacadeクラスによって、ユーザーはサブシステムの内部構造を知る必要がなくなり、実装から解放されます。
Facadeパターンの要件
Facadeクラスは、サブシステム内部に処理を委譲するだけで、複雑な実装は持ちません。
サブシステムが持つ多様な機能の中から、ユーザーの用途に合わせた窓口を提供します。
Facadeクラスは、サブシステム自身からは利用されません。あくまでサブシステムの外部から利用される窓口です。
Facadeパターンは、サブシステムの直接利用を妨げません。Facadeクラスを介さずに、サブシステムの機能を直接利用することも可能です。
Facadeクラスの利用は強制ではなく、必要に応じてサブシステムの機能を直接利用できます。Facadeパターンは、サブシステムを隠蔽するものではありません。
Facadeパターンのクラス図は、以下のようになります。
mermaid
classDiagram
class Facade{
+operation()
}
class Subsystem1{
+operation1()
}
class Subsystem2{
+operation2()
}
class Subsystem3{
+operation3()
}
Facade --|> Subsystem1
Facade --|> Subsystem2
Facade --|> Subsystem3
適用例
Javaによる適用例を以下に示します。
java
// サブシステム
package driving;
class Car {
public void start() {System.out.println("Car: Start");}
public void stop() {System.out.println("Car: Stop");}
public void accelerate() {System.out.println("Car: Accelerate");}
public void brake() {System.out.println("Car: Brake");}
}
class Driver {
public void turnLeft() {System.out.println("Driver: Turn Left");}
public void turnRight() {System.out.println("Driver: Turn Right");}
}
// Facadeクラス
class DrivingSimulator {
private Car car;
private Driver driver;
public DrivingSimulator() {
this.car = new Car();
this.driver = new Driver();
}
public void simulate() {
car.start();
car.accelerate();
driver.turnLeft();
driver.turnRight();
car.brake();
car.stop();
}
}
// 利用例
class FacadeTest{
public static void main(String[] args){
DrivingSimulator simulator = new DrivingSimulator();
simulator.simulate();
}
}
この例では、`DrivingSimulator`クラスがFacadeクラスに相当し、`Car`クラスと`Driver`クラスがサブシステムに相当します。`DrivingSimulator#simulate()`メソッドは、`Car`と`Driver`のメソッドをまとめて呼び出し、ユーザーはサブシステムの詳細を気にせずにシミュレーションを実行できます。
関係するパターン
Abstract Factoryパターン: Abstract Factoryパターンは、Facadeパターンの具体例と捉えることができます。Abstract Factoryパターンでは、ConcreteFactoryクラスがFacadeクラスに相当し、複数の製品の生成を隠蔽し、一貫性のあるインターフェースを提供します。
関連項目
デザインパターン
パッケージ (
Java)