소개
등록 트리 모드는 등록 모드 또는 등록자 모드라고도 합니다. 등록 트리 패턴은 객체 인스턴스를 전역 객체 트리에 등록하고 필요할 때 객체 트리에서 선택하는 패턴 설계 방법입니다. 과일나무와 달리 과일은 한 번만 따낼 수 있지만, 등록된 나무의 인스턴스는 수없이 따낼 수 있습니다.
등록 트리 모드를 사용하면 인스턴스를 더 잘 조정하고 관리할 수 있는데, 이는 전역 변수를 사용하는 것만큼 편리하고 실용적입니다.
구현
자세한 내용은 코드 주석을 참고해주세요
코드:
<?php header('Content-Type:text/html;charset=utf-8'); /** * Class Register 注册树类 */ class Register { // 树的枝干-用于储存树上的果实(实例) public static $objects; /** * 将实例插入注册树中 * * @param $alias 对象别名-注册树中的名称 * @param $object 对象实例 */ public static function set($alias, $object) { self::$objects[$alias] = $object; } /** * 从注册树中读取实例 * * @param $alias 对象别名-注册树中的名称 * * @return mixed 返回的对象实例 */ public static function get($alias) { if (isset(self::$objects[$alias])) { return self::$objects[$alias]; } else { echo '您要找的对象实例不存在哦<br>'; } } /** * 销毁注册树中的实例 * * @param $alias 对象别名-注册树中的名称 */ public static function _unset($alias) { unset(self::$objects[$alias]); } } /** * Class demo 演示类 */ class demo { /* * 测试方法 */ public function test() { echo '看这里看这里<br><br>'; } } // 实例化测试类,获取对象实例 $demo = new demo(); // 注册到树上 $tree = Register::set('de', $demo); // 取出来 $de_true = Register::get('de'); // 测试 $de_true->test(); // 销毁 Register::_unset('de'); // 尝试再次取出来 $de_true_two = Register::get('de'); // 尝试再次测试 $de_true_two->test();
실행 결과:
// 第一次成功运行 看这里看这里 // 第二次销毁后找不到对象实例 您要找的对象实例不存在哦 // 第二次销毁后找不到对象实例,故无法调用对象方法,报错 Fatal error: Call to a member function test() on a non-object in E:\phpStudy\WWW\test\test.php on line 77
확장
위에서는 예제를 통해 등록 트리 패턴을 구축하는 방법을 보여 주었습니다. 그런 다음 아래에서 등록 트리를 결합하겠습니다. 패턴과 팩토리 패턴을 싱글톤과 결합하여 패턴을 결합하여 해당 코드를 구현하는 방법을 확인합니다
코드:
<?php header('Content-Type:text/html;charset=utf-8'); /** * Class Register 注册树类 */ class Register { // 树的枝干-用于储存树上的果实(实例) public static $objects; /** * 将实例插入注册树中 * * @param $alias 对象别名-注册树中的名称 * @param $object 对象实例 */ public static function set($alias, $object) { self::$objects[$alias] = $object; } /** * 从注册树中读取实例 * * @param $alias 对象别名-注册树中的名称 * * @return mixed 返回的对象实例 */ public static function get($alias) { if (isset(self::$objects[$alias])) { return self::$objects[$alias]; } else { echo '您要找的对象实例不存在哦<br>'; } } /** * 销毁注册树中的实例 * * @param $alias 对象别名-注册树中的名称 */ public static function _unset($alias) { unset(self::$objects[$alias]); } } /** * Class demo 单例演示类 */ class singleDemo { // 存放实例属性 public static $_instance; public $content; // 私有化构造函数,防止外部new private function __construct($content) { $this->content = $content; } // 获取实例 public static function getInstance($content) { // 判断实例是否存在 if (!(self::$_instance instanceof self)) { self::$_instance = new self($content); } return self::$_instance; } // 私有化克隆方法,防止克隆 private function __clone() { } // 测试方法 public function test() { echo $this->content.'<br>'; } } /** * Class factory 工厂类 */ class Factory { // 生产 public static function create($content) { // 返回对象 return singleDemo::getInstance($content); } } // 生产并返回对象实例 $object = Factory::create('我是content参数内容,哈哈'); // 执行测试方法 $object->test();
실행 결과:
我是content参数内容,哈哈