의도
공유 기술을 사용하여 다수의 세밀한 개체를 효과적으로 지원
플라이웨이트 모드는 객체의 저장 오버헤드를 변경합니다
2. 플라이웨이트 모드 구조도
3. 플라이급 모드의 주인공
추상 플라이급 역할: 이 역할은 모든 구체적인 플라이급 클래스의 상위 클래스이며 이러한 클래스에 대해 구현해야 하는 공용 인터페이스를 지정합니다. 외부 상태가 필요한 작업은 비즈니스
를 호출하여 매개변수로 전달할 수 있습니다.
콘크리트 플라이웨이트 역할: 플라이웨이트 인터페이스를 구현하고 내부 상태(있는 경우)를 위한 저장 공간을 가져옵니다. ConcreteFlyweight 객체는 공유 가능해야 합니다. 저장되는 상태는 내부여야 합니다
UnsharedConcreteFlyweight 역할: 모든 Flyweight 하위 클래스를 공유할 필요는 없습니다. Flyweigth는 공유를 가능하게 하지만 공유를 강요하지는 않습니다.
FlyweightFactory 역할: Flyweight 역할을 만들고 관리하는 역할을 담당합니다. 이 역할은 시스템에서 플라이웨이트 개체를 적절하게 공유할 수 있도록 보장해야 합니다.
클라이언트 역할: 이 역할은 모든 플라이급 객체에 대한 참조를 유지해야 합니다. 이 캐릭터는 모든 플라이웨이트 객체의 외부 상태를 자체적으로 저장해야 합니다
4. 플라이급 모델의 장점과 단점
플라이웨이트 모드의 장점: 플라이웨이트 모드는 메모리의 개체 수를 크게 줄일 수 있습니다.
플라이웨이트 모드의 단점:
1. 플라이웨이트 모드는 시스템을 더욱 복잡하게 만듭니다
2. 플라이웨이트 모드는 플라이웨이트 물체의 상태를 외부화하고, 외부 상태를 읽으면 실행 시간이 약간 길어집니다
5. 플라이웨이트 모드 적용 시나리오
다음 조건이 참인 경우 플라이웨이트 모드를 사용하세요.
1. 애플리케이션이 많은 수의 객체를 사용합니다
2. 전적으로 많은 수의 객체 사용으로 인해 큰 저장 오버헤드가 발생합니다
3. 객체의 대부분의 상태는 외부 상태로 변경될 수 있습니다
4. 객체의 외부 상태를 삭제하면 상대적으로 적은 수의 공유 객체로 많은 객체 그룹을 대체할 수 있습니다
5. 응용 프로그램은 개체 식별에 의존하지 않습니다.
6. 플라이웨이트 모드 및 기타 모드
싱글톤 모드: 클라이언트는 팩토리 객체를 통해 생성되거나 획득된 플라이웨이트 객체를 참조하려고 합니다. 클라이언트가 플라이웨이트 객체를 참조할 때마다 동일한 팩토리 객체를 통해 참조할 수 있습니다. 물체. 따라서 플라이웨이트 팩토리는 클라이언트가 하나의 팩터리 인스턴스만 참조하도록 싱글톤 모드로 설계할 수 있습니다. 모든 플라이웨이트 개체는 팩토리 개체에 의해 균일하게 관리되므로 클라이언트 측에서 여러 팩터리 개체를 참조할 필요가 없습니다. 단순한 플라이웨이트 모드이든 복합 플라이웨이트 모드의 플라이웨이트 공장 역할이든 싱글톤 모드로 설계할 수 있으며 결과에 아무런 영향을 미치지 않습니다.
복합 모드: 복합 플라이웨이트 모드는 실제로 단순 플라이웨이트 모드와 복합 모드의 조합입니다. 단순 플라이웨이트 개체는 리프 개체로 사용하여 공유할 수 있고, 복합 플라이웨이트 개체는 분기 개체로 사용할 수 있으므로 복합 플라이웨이트 역할에 집계 관리 방법을 추가할 수 있습니다.
7. 플라이웨이트 모드 PHP 예제
<?php /** * 抽象享元角色 */ abstract class Flyweight { /** * 示意性方法 * @param string $state 外部状态 */ abstract public function operation($state); } /** * 具体享元角色 */ class ConcreteFlyweight extends Flyweight { private $_intrinsicState = null; /** * 构造方法 * @param string $state 内部状态 */ public function __construct($state) { $this->_intrinsicState = $state; } public function operation($state) { echo 'ConcreteFlyweight operation, Intrinsic State = ' . $this->_intrinsicState . ' Extrinsic State = ' . $state . '<br />'; } } /** * 不共享的具体享元,客户端直接调用 */ class UnsharedConcreteFlyweight extends Flyweight { private $_intrinsicState = null; /** * 构造方法 * @param string $state 内部状态 */ public function __construct($state) { $this->_intrinsicState = $state; } public function operation($state) { echo 'UnsharedConcreteFlyweight operation, Intrinsic State = ' . $this->_intrinsicState . ' Extrinsic State = ' . $state . '<br />'; } } /** * 享元工厂角色 */ class FlyweightFactory { private $_flyweights; public function __construct() { $this->_flyweights = array(); } public function getFlyweigth($state) { if (isset($this->_flyweights[$state])) { return $this->_flyweights[$state]; } else { return $this->_flyweights[$state] = new ConcreteFlyweight($state); } } } /** * 客户端 */ class Client { /** * Main program. */ public static function main() { $flyweightFactory = new FlyweightFactory(); $flyweight = $flyweightFactory->getFlyweigth('state A'); $flyweight->operation('other state A'); $flyweight = $flyweightFactory->getFlyweigth('state B'); $flyweight->operation('other state B'); /* 不共享的对象,单独调用 */ $uflyweight = new UnsharedConcreteFlyweight('state A'); $uflyweight->operation('other state A'); } } Client::main(); ?>
8. 복합 플라이웨이트 모드
복합 플라이웨이트 모드 개체는 합성 모드를 사용하여 몇 가지 간단한 플라이웨이트로 구성됩니다
복합 플라이급 역할로 표시되는 개체는 공유할 수 없지만 복합 플라이급 개체는 단순 플라이급 개체의 여러 조합으로 분해될 수 있습니다.
9. 복합 플라이웨이트 모드 PHP 예
<?php /** * 抽象享元角色 */ abstract class Flyweight { /** * 示意性方法 * @param string $state 外部状态 */ abstract public function operation($state); } /** * 具体享元角色 */ class ConcreteFlyweight extends Flyweight { private $_intrinsicState = null; /** * 构造方法 * @param string $state 内部状态 */ public function __construct($state) { $this->_intrinsicState = $state; } public function operation($state) { echo 'ConcreteFlyweight operation, Intrinsic State = ' . $this->_intrinsicState . ' Extrinsic State = ' . $state . '<br />'; } } /** * 不共享的具体享元,客户端直接调用 */ class UnsharedConcreteFlyweight extends Flyweight { private $_flyweights; /** * 构造方法 * @param string $state 内部状态 */ public function __construct() { $this->_flyweights = array(); } public function operation($state) { foreach ($this->_flyweights as $flyweight) { $flyweight->operation($state); } } public function add($state, Flyweight $flyweight) { $this->_flyweights[$state] = $flyweight; } } /** * 享元工厂角色 */ class FlyweightFactory { private $_flyweights; public function __construct() { $this->_flyweights = array(); } public function getFlyweigth($state) { if (is_array($state)) { // 复合模式 $uFlyweight = new UnsharedConcreteFlyweight(); foreach ($state as $row) { $uFlyweight->add($row, $this->getFlyweigth($row)); } return $uFlyweight; } else if (is_string($state)) { if (isset($this->_flyweights[$state])) { return $this->_flyweights[$state]; } else { return $this->_flyweights[$state] = new ConcreteFlyweight($state); } } else { return null; } } } /** * 客户端 */ class Client { /** * Main program. */ public static function main() { $flyweightFactory = new FlyweightFactory(); $flyweight = $flyweightFactory->getFlyweigth('state A'); $flyweight->operation('other state A'); $flyweight = $flyweightFactory->getFlyweigth('state B'); $flyweight->operation('other state B'); /* 复合对象*/ $uflyweight = $flyweightFactory->getFlyweigth(array('state A', 'state B')); $uflyweight->operation('other state A'); } } Client::main(); ?>
10. PHP 플라이웨이트 모드 현황
다른 모드와 비교했을 때 Flyweight 모드는 현재 PHP 버전에서는 그다지 의미가 없습니다. 왜냐하면 PHP의 수명주기는 페이지 수준, 즉 PHP 파일 실행부터 시작하여 필요한 리소스가 로드되기 때문입니다. 실행이 완료되면 이러한 모든 리소스가 해제되며 일반적으로 페이지를 너무 오랫동안 실행하지 않습니다.
위는 플라이웨이트 모드를 구현하기 위해 PHP를 사용하는 코드입니다. 또한 플라이웨이트 모드에 대한 몇 가지 개념적 차이가 있어 모든 분들의 학습에 도움이 되기를 바랍니다.