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