Facade là mẫu thiết kế thuộc nhóm kiến trúc.
Facade cung cấp 1 mẫu giao diện chung đơn giản thay cho 1 nhóm giao diện có trong 1 hệ thống con. Facade định nghĩa 1 giao diện ở cấp độ cao hơn để giúp người dùng có thể dễ dàng sử dụng hệ thống con này.
Facade cho phép các đối tượng truy cập trực tiếp giao diện chung này để giao tiếp vs các giao diện có trong hệ thống con. Mục tiêu là che giấu các hoạt động phức tạp bên trong hệ thống con, làm cho hệ thống con dễ sử dụng hơn.
Kiến trúc

- Facade: Facade nắm rõ được hệ thống con nào đảm nhiệm việc đáp ứng yêu cầu của client, nó sẽ chuyển yêu cầu của client đến các đối tượng hệ thống con tương ứng.
- Additional Facade: có thể được tạo ra để tránh việc làm phức tạp 1 Facade. Có thể được sử dụng bởi Client hoặc Facade.
- Complex Subsystems: bao gồm nhiều object khác nhau, được cài đặt các chức năng của hệ thống con, xử lý công việc được gọi bởi Facade. Các lớp này không cần biết Facade và không tham chiếu đến nó.
- Client: sử dụng Facade để tương tác vs các subsytem.
Các Facade thường là Singleton.
Chúng ta thường sử dụng Facade khi:
- Muốn gom nhóm các chức năng lại để client dễ sử dụng.
- Giảm sự phụ thuộc. Phân lớp các hệ thống con, định nghĩa cổng giao tiếp chung cho hệ thống con thông qua Facade.
- Đóng gói chức năng, che giấu các thuật toán phức tạp.
Ví dụ khi bạn gọi điện đến đặt hàng, tổng đài sẽ là Facade, thực hiện tất cả các thao tác: lấy thông tin khác hàng, xác nhận thông tin, kiểm tra tồn kho, lên đơn, thanh toán, giao hàng, update stock …
Ví dụ minh họa với code PHP:
Subsytem:
class AccountService
{
public function getAccount($str) {
echo "Get account of " . $str;
}
}
class MailService
{
public function sendMail($mailTo) {
echo "Send mail to " . $mailTo;
}
}
class PaymentService
{
public function paymentByCreditcard() { ... }
public function paymentByPaypal() { ... }
public function paymentByCash() { ... }
}
class ShippingService
{
public function freeShipping() { ... }
public function standardShipping() { ... }
}Tạo Facade:
class ShopFacade
{
private static $instance;
private $accountService;
private $mailService;
private $paymentService;
private $shippingService;
private __construct() {
$this->accountService = new AccountService;
$this->mailService = new MailService;
$this->paymentService = new PaymentService;
$this->shippingService = new ShippingService;
}
public function getInstance() {
if (static::$instance === null)
static::$instance = new ShopFacade;
return static::$instance;
}
public function buyProductByCashWithFreeShipping($email) {
$this->accountService->getAccount($email);
$this->paymentService->paymentByCash();
$this->shippingService->freeShipping();
$this->mailService->sendMail($email);
}
// tương tự:
public function buyProductByPaypalWithStandardShipping() { ... }
}Client gọi Facade:
ShopFacade::getInstance()->buyProductBuyCashWithFreeShipping($email);