注冊樹模式(Registry Pattern ):注冊樹模式為應用中經常使用的對象創建一個中央存儲器來存放這些對象 —— 通常通過一個只包含靜態方法的抽象類來實現(或者通過單例模式)。也叫做注冊器模式
(一)為什么需要注冊樹模式
解決常用對象的存放問題,實現類似于全局變量的功能。
(二)注冊樹模式UML圖
暫無,跪求提供
(三)簡單實例
<?php
//User類用于測試
class User{}
//注冊樹類
class Registry
{
protected static $objects; //用于存放實例
//存入實例方法
static public function set($key, $object)
{
self::$objects[$key] = $object;
}
//獲取實例方法
static public function get($key)
{
if (!isset(self::$objects[$key]))
{
return false;
}
return self::$objects[$key];
}
//刪除實例方法
static public function _unset($key)
{
unset(self::$objects[$key]);
}
}
$user = new User;
//存入實例
Registry::set('User',$user);
//查看實例
var_dump(Registry::get('User'));
//刪除實例
Registry::_unset('User');
//再次查看實例
var_dump(Registry::get('User'));
注冊樹經常與單例模式一起使用,先查看注冊樹上是否有該實例,有就直接使用,沒有就生成一個實例,并掛到樹上。有些時候我們還可以這樣做,讓get方法如果get不到實例的時候就自動new一個存放起來,這樣我們使用時就不用管有沒有存放過這個實例,反正沒有的話get方法也會幫我們存放。
//獲取實例方法
static public function get($key)
{
if (!isset(self::$objects[$key]))
{
self::$objects[$key] = new $key;
}
return self::$objects[$key];
}
當然使用這種方式的話,查看實例是否存在,就不能使用get方法了。因為調用get方法以后,不存在也會生成一個實例。