構造パターン
複雑なサブシステムに対してシンプルな統一インターフェースを提供する。利用側のコードを簡潔にする。
// 在庫管理
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) { ... }
}
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");
以下の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 【要件】 ・非同期実行対応 ・進捗状況の取得 ・キャンセル機能