Les Design Patterns - Partie 2¶§
Un design pattern est un moyen de conception répondant à un problème récurrent.
Le pattern Factory¶§
Objectif : Fournir un objet prêt à l’emploi, configuré correctement, avec les classes instanciées
- Confier à une autre classe la création des instances d’une classe
- Configuration spécifique
- Protection des instances
- On peut aussi utiliser une méthode statique dans la même classe
class FilmFactory{
static function create(){
// Ajouter le film dans la base
self::ajoutFilm($data)
// Retourner une instance
return new Film($data)
}
}
Le pattern factory a pour but de laisser des classes usine créer les instances à votre place.
Le pattern Singleton¶§
Objectif : S’assurer qu’une seule et même instance d’une classe soit utilisée
- Contre les problèmes de duplication d’objet
- Fonctionne très bien associé au pattern Factory
- Méthode :
- On va ici définir le constructeur en privé (ou protected)
- Puis utiliser une méthode ou une classe Factory
Exemple: Pour la connection à la base de données, on utilise une seule instance de Connection.
Le pattern Observer¶§
Il est possible de suivre l’état d’un objet grâce à un observer
Le pattern observer permet de lier certains objets à des « écouteurs » eux-mêmes chargés de notifier les objets auxquels ils sont rattachés.
Méthode:
- L’objet observé doit implémenter SplSubject
- Il faut redéfinir les 3 méthodes suivantes:
- attach(SplObserver) : ajouter un observateur à l’objet
- detach(SplObserver) : retirer un observateur
- notify() : prévenir les observateurs de quelque chose
Exemple d’utilisation : Surveiller les erreurs ou les comportements et envoyer un email en cas de problème
Le pattern Strategy¶§
Séparer les algorithmes
Le pattern strategy sert à délocaliser la partie algorithmique d’une méthode afin qu’elle soit réutilisable, évitant ainsi la duplication de cet algorithme.
- Utiliser des interfaces pour partager des méthodes similaires entre des classes
L’injection de dépendance¶§
Objectif: Rendre une classe indépendante de ses dépendances
Voici un exemple pour comprendre:
class Films{
private $db;
function __construct(){
$db = MyPDO::getInstance();
}
}
Cette classe est dépendante de PDO, elle force l’utilisateur a utiliser PDO
class Films{
private $db;
function __construct( $db ){
$this->db = $db;
}
}
Maintenant, je peux envoyer n’importe quel type de connection à une base de donnée à cette classe pour peu que cet objet implémente les méthodes “connect()”, “prepare()”, etc...