PHP設計模式之註冊樹模式

簡介

註冊樹模式又稱註冊模式註冊器模式。註冊樹模式經過將對象實例註冊到一棵全局的對象樹上,須要的時候從對象樹上採摘的模式設計方法。和果樹不一樣的是,果子只能採摘一次,而註冊樹上的實例卻能夠無數次獲取。php

使用了註冊樹模式後,對於實例,咱們可以更好地統籌管理安排,就像使用全局變量同樣的方便實用。html

實現

下面我以代碼的形式向你們演示一下,詳解請參照代碼註釋segmentfault

代碼:設計模式

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

擴展

上面已經經過實例向你們展現瞭如何構建註冊樹模式,相信你們應該都明白了,那麼下面咱們就將註冊樹模式和工廠模式與單例模式結合起來,看看如何實現他們的代碼測試

代碼:this

<?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);
    }
}

// 加入註冊樹
Register::set('si',Factory::create('我是content參數內容,哈哈'));
// 取出對象實例
$object = Register::get('si');
// 執行測試方法
$object->test();
// 打印對象
var_dump($object);

運行結果:設計

我是content參數內容,哈哈
object(singleDemo)#1 (1) { ["content"]=> string(34) "我是content參數內容,哈哈" }

地址

關於工廠模式和單例模式,以前的文章我也說過,若是有興趣,能夠從如下地址前往:code

PHP設計模式之工廠模式:https://segmentfault.com/a/11...htm

PHP設計模式之單例模式:https://segmentfault.com/a/11...

相關文章
相關標籤/搜索