← 一覧に戻る

Facade

構造パターン

複雑なサブシステムに対してシンプルな統一インターフェースを提供する。利用側のコードを簡潔にする。

目次
  1. クラス図
  2. シーケンス図
  3. 使いどころ
  4. コード例
  5. AIプロンプト例
  6. 注意点
  7. 関連パターン

クラス図

シーケンス図

使いどころ

コード例

シナリオ:注文処理の統合

複雑なサブシステム群

// 在庫管理
public class InventoryService {
    public boolean checkStock(String productId, int quantity) { ... }
    public void reserveStock(String productId, int quantity) { ... }
    public void releaseStock(String productId, int quantity) { ... }
}

// 決済処理
public class PaymentService {
    public PaymentResult authorize(String customerId, int amount) { ... }
    public void capture(String authorizationId) { ... }
    public void refund(String paymentId) { ... }
}

// 配送手配
public class ShippingService {
    public ShippingQuote getQuote(String address, double weight) { ... }
    public String createShipment(ShippingRequest request) { ... }
    public void cancelShipment(String shipmentId) { ... }
}

// 通知送信
public class NotificationService {
    public void sendOrderConfirmation(String email, Order order) { ... }
    public void sendShippingNotification(String email, String trackingId) { ... }
}

Facadeクラス

public class OrderFacade {
    private final InventoryService inventory;
    private final PaymentService payment;
    private final ShippingService shipping;
    private final NotificationService notification;

    public OrderFacade() {
        this.inventory = new InventoryService();
        this.payment = new PaymentService();
        this.shipping = new ShippingService();
        this.notification = new NotificationService();
    }

    /**
     * 注文処理を一括で実行
     * 内部の複雑な処理フローを隠蔽
     */
    public OrderResult placeOrder(OrderRequest request) {
        try {
            // 1. 在庫確認・確保
            for (OrderItem item : request.getItems()) {
                if (!inventory.checkStock(item.getProductId(), item.getQuantity())) {
                    return OrderResult.failure("在庫不足: " + item.getProductId());
                }
                inventory.reserveStock(item.getProductId(), item.getQuantity());
            }

            // 2. 決済
            PaymentResult paymentResult = payment.authorize(
                request.getCustomerId(), 
                request.getTotalAmount()
            );
            if (!paymentResult.isSuccess()) {
                releaseAllStock(request.getItems());
                return OrderResult.failure("決済失敗");
            }

            // 3. 配送手配
            String trackingId = shipping.createShipment(
                new ShippingRequest(request.getAddress(), request.getItems())
            );

            // 4. 決済確定
            payment.capture(paymentResult.getAuthorizationId());

            // 5. 通知
            Order order = createOrder(request, trackingId);
            notification.sendOrderConfirmation(request.getEmail(), order);

            return OrderResult.success(order);

        } catch (Exception e) {
            // ロールバック処理
            handleOrderFailure(request);
            return OrderResult.failure("注文処理エラー: " + e.getMessage());
        }
    }

    /**
     * 注文キャンセル
     */
    public CancelResult cancelOrder(String orderId) {
        // 複雑なキャンセル処理を隠蔽
        Order order = findOrder(orderId);
        shipping.cancelShipment(order.getTrackingId());
        payment.refund(order.getPaymentId());
        releaseAllStock(order.getItems());
        return CancelResult.success();
    }

    private void releaseAllStock(List<OrderItem> items) {
        for (OrderItem item : items) {
            inventory.releaseStock(item.getProductId(), item.getQuantity());
        }
    }
}

使用例

// Facadeを使えば1行で注文完了
OrderFacade orderFacade = new OrderFacade();

OrderRequest request = new OrderRequest()
    .customerId("C001")
    .addItem("PROD-A", 2)
    .addItem("PROD-B", 1)
    .address("東京都渋谷区...")
    .email("user@example.com");

OrderResult result = orderFacade.placeOrder(request);

if (result.isSuccess()) {
    System.out.println("注文完了: " + result.getOrder().getId());
}

// キャンセルも簡単
orderFacade.cancelOrder("ORDER-12345");

AIプロンプト例

カスタマイズ用プロンプト

以下のFacadeパターンを作成してください。

【用途】
ユーザー登録処理

【統合するサブシステム】
1. UserRepository - ユーザー情報保存
2. PasswordService - パスワードハッシュ化
3. EmailService - 確認メール送信
4. AuditService - 監査ログ記録
5. CacheService - キャッシュ更新

【Facadeのメソッド】
・registerUser(RegistrationRequest): RegistrationResult
・verifyEmail(String token): boolean
・resendVerificationEmail(String userId): void

【エラーハンドリング】
・途中で失敗した場合のロールバック
・各ステップのエラーメッセージ統合

レポート生成用プロンプト

レポート生成用のFacadeを作成してください。

【統合するサブシステム】
1. DataFetcher - 複数DBからデータ取得
2. DataTransformer - データ変換・集計
3. ChartGenerator - グラフ生成
4. PdfRenderer - PDF出力
5. StorageService - ファイル保存
6. EmailSender - メール送信

【Facadeのメソッド】
・generateReport(ReportConfig): ReportResult
・scheduleReport(ReportConfig, CronExpression): void
・getReportStatus(String reportId): ReportStatus

【要件】
・非同期実行対応
・進捗状況の取得
・キャンセル機能

注意点

← 一覧に戻る