На мой взгляд этот паттерн зря называют фасадом. Дело в том, что в русском языке он довольно прочно ассоциируется с постройками, с лицевой стороной здания. Но суть паттерна несколько другая. Это скорее больше похоже на пульт управления умным домом, если уж рассматривать его с точки зрения домохозяйств.
Допустим у вас дома есть кофемашина, телевизор и электрический тазик ноги парить. Жена моя недавно себе купила. 

Вот теперь представьте, что приходите вечером с работы домой. Уставший. А тут на тебе: нужно включить кофемашину, выбрать режим "руссиано", включить телевизор, найти канал с футболом, включить тазик, выбрать режим массажера с подогревом. И тогда наступит долгожданная лафа. В руке ароматный кофе, наши забили гол, ноги в тазике.
Но если у вас есть система умного дома, то можно заранее все это настроить, и запустить одной кнопкой. Даже издалека, по мобиле.
Вот так же работает паттерн "фасад". В кодовом примере можно выразить так.
Имеем три устройства, делающих жизнь приятной:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php
// Кофемашина
class CoffeeMachine
{
public function cappuccino()
{
return 'Cappuccino';
}
public function russiano()
{
return 'Russiano';
}
}
// Телевизор
class TV
{
protected $channels = [
1 => '1tv',
2 => 'RenTv',
3 => 'MatchTv'
];
public function сhannelSelector($num)
{
return $this->channels[$num];
}
}
// Тазик, ноги парить.
class FootMassager
{
public function addColdWater()
{
return 'холодная вода';
}
public function addHotWater()
{
return 'горячая вода';
}
}
Настраиваем умный дом на определенные с ними действия;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Этот класс построен по принципу патерна Facade
class SmartHouse
{
public function __construct($cofeeMachine, $TV, $footMassager)
{
$this->cofeeMachine = $cofeeMachine;
$this->TV = $TV;
$this->footMassager = $footMassager;
}
public function sweetHome()
{ // Вызываем нужные методы из разных классов
$cofee = $this->cofeeMachine->russiano();
$football = $this->TV->сhannelSelector(3);
$water = $this->footMassager->addHotWater();
// Жизнь удалась.
return 'Хлебнуть '. $cofee
.', посмотреть '. $football
.', сунуть ноги в тазик, где '. $water;
}
}
А теперь запускаем все одной кнопкой (вызвав один метод) из фасада (системы умного дома)
1
2
3
4
5
6
7
8
9
10
11
// Гаджеты
$cofeeMachine = new CoffeeMachine;
$TV = new TV;
$footMassager = new FootMassager;
// Умный дом
$smartHouse = new SmartHouse($cofeeMachine, $TV, $footMassager);
// Запускаем программу действий одним движением.
echo $smartHouse->sweetHome();
Если вы знакомы с паттерном "декоратор", то могли заметить, что фасад, это его антипод. То есть почти наоборот. Декоратор добавляет методы одного класса в другой, а фасад выбирает нужные методы из разных классов.
Что еще нужно знать о фасаде.
Первое, он никоем образом не ограничевает прямого доступа к классам. Это помощник, а не ограничитель.
Второе - он не управляет системой в целом, только необходимой частью. Если нужна одна точка управления всей системой, нужно применить паттерн фронт-контроллер (Front controller).
Третье. В классе, построенному по этому паттерну, не должно быть команды new. Если велик соблазн инициализировать объект внутри фасада, лучше посмотреть в сторону семейства порождающих паттернов.
Роман