>  기사  >  php教程  >  PHP 디자인 패턴 등록 트리 패턴

PHP 디자인 패턴 등록 트리 패턴

高洛峰
高洛峰원래의
2016-11-16 10:04:051249검색

소개

등록 트리 모드는 등록 모드 또는 등록자 모드라고도 합니다. 등록 트리 패턴은 객체 인스턴스를 전역 객체 트리에 등록하고 필요할 때 객체 트리에서 선택하는 패턴 설계 방법입니다. 과일나무와 달리 과일은 한 번만 따낼 수 있지만, 등록된 나무의 인스턴스는 수없이 따낼 수 있습니다.

등록 트리 모드를 사용하면 인스턴스를 더 잘 조정하고 관리할 수 있는데, 이는 전역 변수를 사용하는 것만큼 편리하고 실용적입니다.

구현

자세한 내용은 코드 주석을 참고해주세요

코드:

<?php
header(&#39;Content-Type:text/html;charset=utf-8&#39;);
/**
 * 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 &#39;您要找的对象实例不存在哦<br>&#39;;
        }

    }

    /**
     * 销毁注册树中的实例
     *
     * @param $alias 对象别名-注册树中的名称
     */
    public static function _unset($alias)
    {
        unset(self::$objects[$alias]);
    }
}

/**
 * Class demo 演示类
 */
class demo
{
    /*
     * 测试方法
     */
    public function test()
    {
        echo &#39;看这里看这里<br><br>&#39;;
    }
}

// 实例化测试类,获取对象实例
$demo = new demo();
// 注册到树上
$tree = Register::set(&#39;de&#39;, $demo);
// 取出来
$de_true = Register::get(&#39;de&#39;);
// 测试
$de_true->test();
// 销毁
Register::_unset(&#39;de&#39;);
// 尝试再次取出来
$de_true_two = Register::get(&#39;de&#39;);
// 尝试再次测试
$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(&#39;Content-Type:text/html;charset=utf-8&#39;);
/**
 * 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 &#39;您要找的对象实例不存在哦<br>&#39;;
        }

    }

    /**
     * 销毁注册树中的实例
     *
     * @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.&#39;<br>&#39;;
    }

}

/**
 * Class factory 工厂类
 */
class Factory
{
    // 生产
    public static function create($content)
    {
        // 返回对象
        return singleDemo::getInstance($content);
    }
}

// 生产并返回对象实例
$object = Factory::create(&#39;我是content参数内容,哈哈&#39;);
// 执行测试方法
$object->test();

실행 결과:

我是content参数内容,哈哈


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.