백과 사전 모드는 객체를 공유하여 메모리 사용량을 줄이고 성능을 향상 시키도록 설계된 구조 설계 패턴입니다. 이 모드는 비슷한 객체가 많은 장면에 적합합니다. 대상의 공개 상태를 공유함으로써 메모리를 절약 할 수있을뿐만 아니라 물체의 생성 및 파괴로 인한 오버 헤드를 줄일 수 있습니다.
백과 사전 모드의 핵심 아이디어는 객체를 내부 상태 (본질 속성) 및 외부 상태 (외부 속성)로 나누는 것입니다. 내부 상태는 변경되지 않으며 여러 객체에 의해 공유 될 수 있지만 외부 상태는 가변적이며 일반적으로 객체의 환경에 의해 결정됩니다.
내부 상태를 공유함으로써 객체 수를 상당히 줄여 메모리 소비가 줄어들 수 있습니다. 외부 상태는 사용 중일 때 동적으로 전달되고 변경됩니다.
Xiangyuan 모델은 다음 시나리오에서 강력한 응용 프로그램 값을 가지고 있습니다.
시스템에 유사한 객체가 많으면 백과 사전 모드를 사용하여 이러한 객체의 내부 상태를 공유하여 메모리 소비를 크게 줄일 수 있습니다.
객체의 속성을 내부 및 외부 상태로 구별 할 수있는 경우 내부 상태를 공유 할 수 있으며 외부 상태는 물체의 환경에 의해 결정됩니다.
PHP에서 즐겨 찾기 모드를 구현하기위한 기본 단계는 다음과 같습니다.
먼저 공유 객체 공장을 만들어 공유 공유 객체 객체를 관리하고 제공합니다.
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
위의 출력 결과에서, 공유 객체의 내부 상태 (예 : 직업)는 동일하지만 외부 상태 (예 : 위치 및 건강)는 다르다는 것을 알 수 있습니다.