百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>网页制作> 运用注册树及工厂模式来替换运用单例模式实践(附案例)
分享文章到:

运用注册树及工厂模式来替换运用单例模式实践(附案例)

发布时间:09/01 来源:未知 浏览: 关键词:

今天在百分百源码网和大家介绍下一种构造型设计模式——注册树模式,别号注册器模式或注册模式,它是用来留存程序中经常使用的对象的实例。注册树模式通过将对象实例注册到一棵全局的对象树上,需要的时候从对象树上采摘。但和实际中的采摘不一样的是,从对象树上摘下来的果子照旧存在对象树上,下次还可以连续摘。

实现代码

注册器模式非常容易懂得和实现。一样会有一个属性用来存置多个对象实例,乃至set及get办法。set办法用来将对象实例留存在属性数组中,get办法用来或取想要的对象实例。

class Registry
{
    // 留存实例对象
    private static $objs = [];
    
    // get猎取实例对象
    public static function get(string $alias) : Object
    {
        if (!isset(self::$objs[$alias])) {
            throw new \Exception($alias . 'not found');
        }
        
        return self::$objs[$alias];
    }
    
    // set将实例对象注册到属性$objs中
    public static function set (string $alias, Object $obj) : void
    {
        if (!isset(self::$objs[$alias])) {
            self::$objs[$alias] = $obj;
        }
    }
    
    // 注销实例
    public static function unset (string $alias) :void
    {
        if (isset(self::$objs[$alias])) {
            unset(self::$objs[$alias]);
        }
    }
}

使用注册树模式和工厂模式来代替单例模式

我们知道,单例是非常有用的,可以幸免资源白费等。但是,单例模式已经被认为是一种背面模式了,认为单例模式不好测试及保护。关于为什么单例模式被认为是背面模式,这里就不细说了,有乐趣的伴侣可以自行谷歌。

那么,我们有没有其他的办法用来包管单例,但不使用单例模式呢?有的,我们可以使用注册树模式和工厂模式来替换单例模式。下面是详细代码:

class Registry
{
    // 留存实例对象
    private static $objs = [];
    
    // get猎取实例对象
    public static function get(string $alias) 
    {
        if (!isset(self::$objs[$alias])) {
            return null;
        }
        return self::$objs[$alias];
    }
    
    // set将实例对象注册到属性$objs中
    public static function set (string $alias, Object $obj) : void
    {
        if (!isset(self::$objs[$alias])) {
            self::$objs[$alias] = $obj;
        }
    }
    
    // 注销实例
    public static function unset (string $alias) :void
    {
        if (isset(self::$objs[$alias])) {
            unset(self::$objs[$alias]);
        }
    }
}

class DbFactory
{
    const ALIAS = 'Db';
    
    public static function create ()
    {
        $db = Registry::get(self::ALIAS);
        if (!$db) {
            $db = new Db([
                'host' => 'localhost',
                'user' => 'root',
                'pass' => '',
                'db_name' => 'test'
            ]);
            Registry::set(self::ALIAS, $db);
        }
        
        return $db;
    }
}

当我们需要Db实例是,只要去调取DbFactory::create即可,该办法包管了单例。下面是测试代码:

$db = DbFactory::create();
var_dump($db);

相关引荐:

1.PHP设计模式之简便工厂模式

2.一文读懂简便工厂、工厂办法、抽象工厂

3.一文读懂php设计模式之代理模式

4.php设计模式:桥接模式学习心得(附案例代码)

以上就是使用注册树及工厂模式来替换使用单例模式实践(附案例)的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有155人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板