zoukankan      html  css  js  c++  java
  • 使用注册树及工厂模式来替代使用单例模式实践(附案例)

    实现代码注册器模式非常容易理解和实现。一般会有一个属性用来存放多个对象实例,以及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);

    链接:https://mp.weixin.qq.com/s/K5UVDqKKTPwfKnQiQkW8MQ

  • 相关阅读:
    nginx 配置文件简介
    nginx 二进制安装
    nginx 简介  http://nginx.org
    全栈https
    运维工程师如果将web服务http专变为https
    12个JQuery小贴士
    AccessHelper 需修改
    MysqlHelper 需要重写
    Func<T,TResult>泛型委托
    DataConvertJson
  • 原文地址:https://www.cnblogs.com/clubs/p/13463649.html
Copyright © 2011-2022 走看看