Der Encyclopedia -Modus ist ein strukturelles Designmuster, das die Speicherverwendung verringert und die Leistung durch gemeinsame Nutzung von Objekten verbessert. Dieser Modus eignet sich für Szenen mit einer großen Anzahl ähnlicher Objekte. Durch die Freigabe des öffentlichen Zustands der Objekte kann es nicht nur das Gedächtnis speichern, sondern auch den Aufwand verringern, der durch die Erstellung und Zerstörung von Objekten verursacht wird.
Die Kernidee des Enzyklopädie -Modus besteht darin, Objekte in interne Zustände (intrinsische Attribute) und externe Zustände (externe Attribute) zu teilen. Der interne Zustand ist unverändert und kann von mehreren Objekten gemeinsam genutzt werden, während der externe Zustand variabel ist und normalerweise durch die Umgebung des Objekts bestimmt wird.
Durch die Freigabe des internen Zustands kann die Anzahl der Objekte erheblich reduziert werden, wodurch der Speicherverbrauch verringert wird. Der externe Zustand wird dynamisch übergeben und im Gebrauch verändert.
Das Xiangyuan -Modell hat in den folgenden Szenarien einen starken Anwendungswert:
Wenn es eine große Anzahl ähnlicher Objekte im System gibt, können Sie den Encyclopedia -Modus verwenden, um den internen Zustand dieser Objekte zu teilen und den Speicherverbrauch erheblich zu verringern.
Wenn die Eigenschaften eines Objekts in interne und externe Zustände unterschieden werden können, kann der interne Zustand geteilt werden und der externe Zustand wird durch die Umgebung des Objekts bestimmt.
Die grundlegenden Schritte zur Implementierung des Genussmodus in PHP sind wie folgt:
Erstellen Sie zunächst eine gemeinsam genutzte Objektfabrik, um gemeinsam genutzte gemeinsame Objektobjekte zu verwalten und bereitzustellen.
class FlyweightFactory {
private $flyweights = [];
public function getFlyweight($key) {
if (!isset($this->flyweights[$key])) {
$this->flyweights[$key] = new ConcreteFlyweight($key);
}
return $this->flyweights[$key];
}
}
Definieren Sie dann die Schnittstelle zum Meta -Objekt.
interface Flyweight {
public function operation();
}
Erstellen Sie als nächstes ein spezifisches Genussobjekt und implementieren Sie die gemeinsam genutzten internen und externen Zustände.
class ConcreteFlyweight implements Flyweight {
private $key;
public function __construct($key) {
$this->key = $key;
}
public function operation() {
// Spezifische Betriebslogik
}
}
Angenommen, ein Charaktermanager muss eine große Anzahl von Charakterobjekten verwalten. In einem Charakterobjekt werden einige Attribute festgelegt, wie z. B. Berufe und Fähigkeiten, während sich andere Attribute wie Position und Gesundheit ändern.
In diesem Fall kann der Beruf als interner Zustand geteilt werden, und die Position und Gesundheit können als externer Staat übergeben werden.
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 "Beruf:{$this->job},Standort:{$this->position},Gesundheitswert:{$this->hp}";
}
}
Im Rahmen des Enzyklopädie -Modus können wir die Anzahl der Rollenobjekte effektiv reduzieren, wodurch die Speicherauslastung und die Systemleistung verbessert werden.
$factory = new FlyweightFactory();
$character1 = $factory->getFlyweight('Krieger');
$character1->setPosition(10, 20);
$character1->setHP(100);
$character1->display();
$character2 = $factory->getFlyweight('Magier');
$character2->setPosition(30, 40);
$character2->setHP(80);
$character2->display();
Ausgangsergebnis:
Beruf:Krieger,Standort:(10, 20),Gesundheitswert:100
Beruf:Magier,Standort:(30, 40),Gesundheitswert:80
Aus den oben genannten Ausgabeergebnissen ist ersichtlich, dass die internen Zustände (wie Beruf) des gemeinsamen Objekts gleich sind, während die externen Zustände (wie Position und Gesundheit) unterschiedlich sind.