百科事典モードは、オブジェクトを共有することでメモリの使用量を削減し、パフォーマンスを向上させるように設計された構造設計パターンです。このモードは、多数の同様のオブジェクトを備えたシーンに適しています。オブジェクトの公共状態を共有することにより、メモリを保存するだけでなく、オブジェクトの作成と破壊によって引き起こされるオーバーヘッドを減らすこともできます。
百科事典モードの中心的なアイデアは、オブジェクトを内部状態(内因性属性)と外部状態(外部属性)に分割することです。内部状態は変更されておらず、複数のオブジェクトで共有できますが、外部状態は可変であり、通常はオブジェクトの環境によって決定されます。
内部状態を共有することにより、オブジェクトの数を大幅に削減できるため、メモリ消費が削減されます。外部状態は動的に渡され、使用時に変更されます。
Xiangyuanモデルは、次のシナリオで強いアプリケーション値を持っています。
システム内に多数の類似のオブジェクトがある場合、百科事典モードを使用してこれらのオブジェクトの内部状態を共有して、メモリ消費を大幅に削減することを検討できます。
オブジェクトのプロパティを内部および外部状態に区別できる場合、内部状態を共有し、外部状態はオブジェクトの環境によって決定されます。
PHPにFunyモードを実装するための基本的な手順は次のとおりです。
まず、共有オブジェクトファクトリを作成して、共有共有オブジェクトを管理および提供します。
class FlyweightFactory {
private $flyweights = [];
public function getFlyweight($key) {
if (!isset($this->flyweights[$key])) {
$this->flyweights[$key] = new ConcreteFlyweight($key);
}
return $this->flyweights[$key];
}
}
次に、メタオブジェクトへのインターフェイスを定義します。
interface Flyweight {
public function operation();
}
次に、特定の享受オブジェクトを作成し、共有内部および外部状態を実装します。
class ConcreteFlyweight implements Flyweight {
private $key;
public function __construct($key) {
$this->key = $key;
}
public function operation() {
// 特定の操作ロジック
}
}
ゲーム開発を例にとると、キャラクターマネージャーが多数のキャラクターオブジェクトを管理する必要があるとします。キャラクターオブジェクトでは、プロフェッションやスキルなど、一部の属性が固定されていますが、他の属性は位置や健康などの変化があります。
この場合、職業は内部状態として共有され、地位と健康を外部状態として渡すことができます。
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 "職業:{$this->job},位置:{$this->position},健康価値:{$this->hp}";
}
}
百科事典モードを通じて、ロールオブジェクトの数を効果的に削減し、それによりメモリの利用とシステムのパフォーマンスを改善できます。
$factory = new FlyweightFactory();
$character1 = $factory->getFlyweight('戦士');
$character1->setPosition(10, 20);
$character1->setHP(100);
$character1->display();
$character2 = $factory->getFlyweight('魔術師');
$character2->setPosition(30, 40);
$character2->setHP(80);
$character2->display();
出力結果:
職業:戦士,位置:(10, 20),健康価値:100
職業:魔術師,位置:(30, 40),健康価値:80
上記の出力の結果から、共有オブジェクトの内部状態(職業など)は同じであり、外部状態(位置や健康など)は異なることがわかります。