第五节 PHP设计模式(四)—注册树模式(Registry Pattern)

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

注册树模式(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) "自动实例化" }

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值