Les design patterns

Petite vérification
Avant de commencer, vérifiez si vous savez...
- écrire l'instruction PHPUnit qui crée un mock de la classe
Arena - compléter la configuration du mock pour qu'il retourne
falsequand sa méthodeisOpen()est appelée - expliquer pourquoi on utilise un mock plutôt qu'une vraie instance de
Arenapour tester la classeFighter
📌 Réponse attendue
Notions théoriques
Un design pattern (patron de conception en français) est une solution générale réutilisable à un problème qui se produit fréquemment dans la conception logicielle.
Les designs design patterns ne sont pas des modèles de conception que vous pouvez transformer directement en code, mais plutôt des descriptions de problèmes et de solutions qui peuvent être utilisées dans de nombreux contextes différents.
Voici trois des design patterns les plus couramment utilisés :
-
Singleton : Ce design pattern assure qu'une classe n'a qu'une seule instance et fournit un point d'accès global à cette instance.
-
Factory : Ce design pattern permet de créer des objets sans spécifier la classe exacte à utiliser. La classe Factory décide quelle sous-classe créer.
-
Observer : Ce design pattern permet à un objet (l'observateur) de surveiller les changements dans un autre objet (le sujet). L'objet observateur est notifié lorsque l'état du sujet change.
Exemple pratique
1) Le design pattern Singleton
Dans notre jeu de combat, nous pourrions par exemple utiliser le design pattern Singleton pour représenter le monde du jeu, qui doit être unique.
Voici comment cela pourrait se présenter :
class GameConfig {
private static $instance;
private $maxPlayers;
private $gameDuration;
private function __construct() {
// Constructeur privé pour empêcher la création directe d'objets
$this->maxPlayers = 4;
$this->gameDuration = 60; // en minutes
}
public static function getInstance() {
if (null === self::$instance) {
self::$instance = new self();
}
return self::$instance;
}
public function getMaxPlayers() {
return $this->maxPlayers;
}
public function getGameDuration() {
return $this->gameDuration;
}
}
Et voici comment vous pourriez l'utiliser pour obtenir l'unique instance de la configuration du jeu :
$config = GameConfig::getInstance();
echo "Nombre maximum de joueurs : " . $config->getMaxPlayers() . "\n";
echo "Durée d'une partie : " . $config->getGameDuration() . " minutes\n";
Cet exemple crée une seule instance de
GameConfig.
$config2 = GameConfig::getInstance();
$config2contient la même instance deGameConfigque$config.
2) Le design pattern Factory
Dans notre jeu de combat, nous pourrions par exemple utiliser le design pattern Factory pour créer nos personnages.
Voici comment cela pourrait se présenter :
class CharacterFactory {
public static function create($type) {
switch ($type) {
case 'guerrier':
return new Warrior();
case 'mage':
return new Mage();
default:
throw new Exception("Type de personnage inconnu : $type");
}
}
}
Et voici comment vous pourriez l'utiliser pour créer un personnage de type Warrior (Guerrier en anglais) :
$character = CharacterFactory::create('guerrier');