Le mode encyclopédie est un modèle de conception structurelle conçu pour réduire l'utilisation de la mémoire et améliorer les performances en partageant des objets. Ce mode convient aux scènes avec un grand nombre d'objets similaires. En partageant l'état public des objets, il peut non seulement enregistrer la mémoire, mais également réduire les frais généraux causés par la création et la destruction d'objets.
L'idée principale du mode encyclopédie est de diviser les objets en états internes (attributs intrinsèques) et états externes (attributs externes). L'état interne est inchangé et peut être partagé par plusieurs objets, tandis que l'état externe est variable et est généralement déterminé par l'environnement de l'objet.
En partageant l'état interne, le nombre d'objets peut être considérablement réduit, réduisant ainsi la consommation de mémoire. L'état externe est passé dynamiquement et modifié lorsqu'il est utilisé.
Le modèle Xiangyuan a une forte valeur d'application dans les scénarios suivants:
Lorsqu'il existe un grand nombre d'objets similaires dans le système, vous pouvez envisager d'utiliser le mode Encyclopedia pour partager l'état interne de ces objets, ce qui réduit considérablement la consommation de mémoire.
Lorsque les propriétés d'un objet peuvent être distinguées en états internes et externes, l'état interne peut être partagé et l'état externe est déterminé par l'environnement de l'objet.
Les étapes de base pour implémenter le mode de plaisir en PHP sont les suivantes:
Tout d'abord, créez une usine d'objets partagés pour gérer et fournir des objets d'objets partagés partagés.
class FlyweightFactory {
private $flyweights = [];
public function getFlyweight($key) {
if (!isset($this->flyweights[$key])) {
$this->flyweights[$key] = new ConcreteFlyweight($key);
}
return $this->flyweights[$key];
}
}
Ensuite, définissez l'interface avec l'objet Meta.
interface Flyweight {
public function operation();
}
Ensuite, créez un objet de plaisir spécifique et implémentez les états internes et externes partagés.
class ConcreteFlyweight implements Flyweight {
private $key;
public function __construct($key) {
$this->key = $key;
}
public function operation() {
// Logique d'opération spécifique
}
}
En prenant le développement du jeu à titre d'exemple, supposons qu'un gestionnaire de personnage doit gérer un grand nombre d'objets de caractère. Dans un objet de caractère, certains attributs sont fixes, tels que les professions et les compétences, tandis que d'autres attributs changent, tels que la position et la santé.
Dans ce cas, la profession peut être partagée en tant qu'état interne, et la position et la santé peuvent être adoptées en tant qu'état externe.
class Character {
private $job;
private $position;
private $hp;
public function __construct($job) {
$this->job = $job;
}
public function setPosition($x, $y) {
$this->position = "($x, $y)";
}
public function setHP($hp) {
$this->hp = $hp;
}
public function display() {
echo "Profession:{$this->job},Emplacement:{$this->position},Valeur de santé:{$this->hp}";
}
}
Grâce à l'encyclopédie, nous pouvons réduire efficacement le nombre d'objets de rôle, améliorant ainsi l'utilisation de la mémoire et les performances du système.
$factory = new FlyweightFactory();
$character1 = $factory->getFlyweight('guerrier');
$character1->setPosition(10, 20);
$character1->setHP(100);
$character1->display();
$character2 = $factory->getFlyweight('Mage');
$character2->setPosition(30, 40);
$character2->setHP(80);
$character2->display();
Résultat de sortie:
Profession:guerrier,Emplacement:(10, 20),Valeur de santé:100
Profession:Mage,Emplacement:(30, 40),Valeur de santé:80
D'après les résultats de sortie ci-dessus, on peut voir que les états internes (comme la profession) de l'objet partagé sont les mêmes, tandis que les états externes (tels que la position et la santé) sont différents.