ファサードパターンは、複雑な処理や複数のサブシステムを持つシステムに対するシンプルな窓口を提供するデザインパターンです。
このパターンの目的は、クライアントコードがサブシステムの詳細を意識せずに、一連の操作を実行できるようにすることです。
以下のサンプルコードを見てみましょう。
このコードでは、宿泊施設予約、レンタカー予約、航空券予約の3つの異なるサブシステムをファサードパターンを使って統合しています。
クライアントコードは、予約ファサードを介して予約プロセスを簡単に実行できます。各サブシステムの詳細について心配する必要はありません。
それにより、コードはシンプルで理解しやすくなります。
このサンプルコードにおいて、ファサードパターンはクライアントコードに対して、複雑さを隠す窓口を提供し、各サブシステムの操作を透過的に実行します。
ファサードを通じて、クライアントコードは予約プロセスを一貫して実行できます。
ファサードパターンは、システムの構造をシンプルにし、コードのメンテナンス性と拡張性を向上させるのに役立ちます。
<?php
/**
* 宿泊施設予約
*/
class HotelBooking
{
public function bookHotel(DateTime $dateTime): void
{
// 宿泊施設の予約処理
echo "Hotel reservation booked at {$dateTime->format('Y-m-d H:i:s')}.\n";
}
}
<?php
/**
* レンタカー予約
*/
class CarRental
{
public function rentCar(DateTime $dateTime): void
{
// レンタカーの予約処理
echo "Car rental booked at {$dateTime->format('Y-m-d H:i:s')}.\n";
}
}
<?php
/**
* 航空券予約
*/
class FlightBooking
{
public function bookFlight(DateTime $dateTime): void
{
// 航空券の予約処理
echo "Flight reservation booked at {$dateTime->format('Y-m-d H:i:s')}.\n";
}
}
<?php
/**
* 予約ファサード
*/
class ReservationFacade
{
private HotelBooking $hotelBooking;
private CarRental $carRental;
private FlightBooking $flightBooking;
public function __construct()
{
$this->hotelBooking = new HotelBooking();
$this->carRental = new CarRental();
$this->flightBooking = new FlightBooking();
}
public function makeReservation(DateTime $dateTime): void
{
// makeReservationだけ知っていれば内部でどのようなサブシステムが使用されているか意識しなくてよい
echo "Starting reservation process:\n";
$this->hotelBookingSystem->bookHotel($dateTime);
$this->carRentalSystem->rentCar($dateTime);
$this->flightBookingSystem->bookFlight($dateTime);
echo "Reservation process completed.\n";
}
}
<?php
$reservationFacade = new ReservationFacade();
$reservationFacade->makeReservation(new DateTime());