Comme son nom l'indique le principe des Facade est de créer une classe qui servira de façade à une autre classe en rendant la classe appellable via des appels statiques.

Exemple

Prenons l'exemple de notre classe QueryBuilder, il peut être pénible de devoir l'instancier pour pouvoir appeller une méthode dessus. On peut effectivement se créer un Factory mais on peut aller encore plus loin :

class QueryFacade{

    public static function __callStatic($name, $arguments){
        $query = new \Core\Database\QueryBuilder(); 
        return call_user_func_array([$query, $name], $arguments);
    }

}

// On pourra ensuite l'utiliser en faisant 
QueryFacade::select('id', 'titre')->from('articles');

// Ce qui équivaut à faire :
$query = new \Core\Database\QueryBuilder(); 
$query->select('id', 'titre')->from('articles');

Ce design pattern très utilisé sur Laravel par exemple est très critiqué car cache une partie du code derrière la méthode magique callStatic, rendant ainsi le code plus difficile à débuguer. En effet, en regardant QueryFacade::select on s'attend naturellement à avoir une méthode statique select sur QueryFacade alors que ce n'est pas le cas (et les IDE sont encore plus perdu lorsqu'il s'agit de fournir de l'autocomplétion).