首頁  >  文章  >  php教程  >  PHP設計模式之註冊樹模式

PHP設計模式之註冊樹模式

高洛峰
高洛峰原創
2016-11-16 10:04:051247瀏覽

簡介

註冊樹模式又稱為註冊模式或註冊器模式。註冊樹模式透過將物件實例註冊到一棵全域的物件樹上,需要的時候從物件樹上採摘的模式設計方法。和果樹不同的是,果子只能採摘一次,而註冊樹上的實例卻可以無數次取得。

使用了註冊樹模式後,對於實例,我們能夠更好地統籌管理安排,就像使用全域變數一樣的方便實用。

實作

下面我以程式碼的形式向大家示範一下,詳解請參照程式碼註解

程式碼:

<?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