概要
Facade パターンとは、複雑なサブシステムへのアクセスを簡単にするために、サブシステムの複数のクラスをまとめて、統一したインターフェースを提供するデザインパターンである。これにより、クライアントはサブシステムの内部の複雑さを意識せず、シンプルなインターフェースを通じて操作が可能となる。
利用目的
- クライアントが複数のサブシステムを操作する際に、シンプルなインターフェースを提供することで、システムの使いやすさを向上させる。
- サブシステムの詳細を隠蔽し、柔軟性とメンテナンス性を向上させる。
- 依存関係を減らし、サブシステムの変更をクライアントに影響させないようにする。
注意点
- Facade パターンを適用しすぎると、システムが単純化されすぎて、詳細な制御が必要な場合に柔軟性を失う可能性がある。
- Facade パターンは、サブシステムを完全に隠すものではなく、サブシステム自体も直接使用可能なことが多い。そのため、設計時にサブシステムへの直接アクセスが必要かどうかを検討することが重要である。
実装
App.java
// Facadeパターンのエントリーポイントクラス
public class App {
public static void main(String[] args) {
HomeFacade homeFacade = new HomeFacade();
// 【ここで、シンプルなインタフェースを利用している】
homeFacade.startMorningRoutine(22);
}
}
HomeFacade.java
// Facadeクラス:複数のサブシステムへのシンプルなインターフェースを提供
public class HomeFacade {
private Lights lights;
private CoffeeMaker coffeeMaker;
private AirConditioner airConditioner;
public HomeFacade() {
this.lights = new Lights();
this.coffeeMaker = new CoffeeMaker();
this.airConditioner = new AirConditioner();
}
public void startMorningRoutine(int temperture) {
lights.turnOn();
coffeeMaker.brew();
airConditioner.setTemperature(temperture);
}
}
Lights.java
// サブシステム1:照明の管理
public class Lights {
public void turnOn() {
System.out.println("Lights are turned on.");
}
}
CoffeeMaker.java
// サブシステム2:コーヒーメーカーの管理
public class CoffeeMaker {
public void brew() {
System.out.println("Coffee is brewing.");
}
}
AirConditioner.java
// サブシステム3:エアコンの管理
public class AirConditioner {
public void setTemperature(int temperature) {
System.out.println("Air conditioner is set to " + temperature + " degrees.");
}
}