注册树模式(Registry Pattern ):注册树模式为应用中经常使用的对象创建一个中央存储器来存放这些对象 —— 通常通过一个只包含静态方法的抽象类来实现(或者通过单例模式)。也叫做注册器模式
(一)为什么需要注册树模式
解决常用对象的存放问题,实现类似于全局变量的功能。Thinkphp和Laravel的容器就是注册树模式。
(二)注册树模式UML图
这个设计模式的UML图比较全,因为他本身不属于23种设计模式,所以这个里边没有注册树的。
(三)简单实例
需要注意注册树经常与单例模式一起使用,先查看注册树上是否有该实例,有就直接使用,没有就生成一个实例,并挂到树上。有些时候我们还可以这样做,让get方法如果get不到实例的时候就自动new一个存放起来,这样我们使用时就不用管有没有存放过这个实例,反正没有的话get方法也会帮我们存放。
class Registry{
protected static $instance;
public static function set($key, $object)
{
return self::$instance[$key] = $object;
}
public static function get($key)
{
if (!isset(self::$instance[$key])){
echo "<br/>";
echo "$key 实例在树中不存在,现在实例化";
echo "<br/>";
return self::$instance[$key] = new $key;
}
return self::$instance[$key];
}
public static function _unset($key)
{
unset(self::$instance[$key]);
}
}
class Notice{
public $message = "自动实例化";
public function setMessage($message){
return $this->message = $message;
}
public function getMessage($message){
return $this->message;
}
}
$notice = new Notice();
// 注册示例到树中
Registry::set("Notice", $notice);
// 设置notice中message属性
Registry::get("Notice")->setMessage("手动实例化");
// 查看树中示例
var_dump(Registry::get("Notice"));
// 删除示例
Registry::_unset("Notice");
// 再次打印
var_dump(Registry::get("Notice"));
//object(Notice)#1 (1) { ["message"]=> string(15) "手动实例化" }
//Notice 实例在树中不存在,现在实例化
//object(Notice)#2 (1) { ["message"]=> string(15) "自动实例化" }

本文深入解析注册树模式,探讨其如何解决常用对象的存放问题,实现类似全局变量的功能。通过具体实例展示了注册树模式与单例模式的结合使用,以及在获取实例时的自动创建机制。
777

被折叠的 条评论
为什么被折叠?



