> php教程 > PHP开发 > PHP 디자인 패턴 등록 트리 패턴

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

高洛峰
풀어 주다: 2016-11-16 10:04:05
원래의
1279명이 탐색했습니다.

소개

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

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

구현

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

코드:

<?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参数内容,哈哈
로그인 후 복사


관련 라벨:
php
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 추천
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿