メインコンテンツまでスキップ

🧩 Facade パターン

✅ 設計意図

  • ログ出力や設定取得など、複数の下位処理を 1 つのインターフェースにまとめる
  • 利用側はシンプルな API を通じて使える

✅ 適用理由

  • ログや設定の取得方法を抽象化・隠蔽
  • 外部ライブラリや実装が変わっても、呼び出し元は影響を受けにくい

✅ 向いているシーン

  • サブシステムが複雑になっている場合に、呼び出しを簡潔に統一したい

✅ コード例

class Config {
static isDebug(): boolean {
return process.env.DEBUG_MODE === "true";
}
}

class LoggerFacade {
static log(message: string) {
console.log(`[LOG] ${message}`);
}

static debug(message: string) {
if (Config.isDebug()) {
console.log(`[DEBUG] ${message}`);
}
}
}

// 利用例
class OrderService {
createOrder(orderId: string) {
LoggerFacade.log(`注文作成: ${orderId}`);
LoggerFacade.debug(`注文詳細: ${orderId}`);
}
}

✅ 解説

このコードは Facade パターン を使用して、LoggerFacade を通じてログ出力の処理を簡潔に利用できるようにする設計を実現している。 Facade パターンは、複雑なサブシステムを簡単に利用できるようにするための統一インターフェースを提供するデザインパターン。

1. Facade パターンの概要

  • Subsystem Classes: 複雑な処理を提供するクラス
    • このコードでは Config が該当
  • Facade: サブシステムを統一的に利用するための簡潔なインターフェースを提供するクラス
    • このコードでは LoggerFacade が該当
  • Client: Facade を利用してサブシステムを操作するクラス
    • このコードでは OrderService が該当

2. 主なクラスとその役割

  • Config
    • サブシステムの一部
    • 環境変数 DEBUG_MODE を基にデバッグモードの有効/無効を判定
  • LoggerFacade
    • Facade クラス
    • ログ出力とデバッグログ出力の統一インターフェースを提供
    • 内部で Config を使用してデバッグモードを判定
  • OrderService
    • クライアントクラス
    • LoggerFacade を利用してログ出力を行う

3. UML クラス図

4.Facade パターンの利点

  • 簡潔なインターフェース: クライアントは複雑なサブシステム(Config)を意識せずに操作可能
  • 疎結合: クライアントとサブシステム間の結合度を低減
  • 保守性向上: サブシステムの変更が Facade 内に閉じ込められるため、クライアントコードへの影響を最小化

この設計は、複雑な内部処理を隠蔽し、クライアントに対して簡潔なインターフェースを提供する必要がある場面で非常に有効であり、 コードの可読性と保守性を向上させる。