今天在内存溢出网和大家介绍下一种结构型设计模式——注册树模式,别名注册器模式或注册模式,它是用来保存程序中经常使用的对象的实例。注册树模式通过将对象实例注册到一棵全局的对象树上,需要的时候从对象树上采摘。但和现实中的采摘不同的是,从对象树上摘下来的果子依旧存在对象树上,下次还可以继续摘。
实现代码
注册器模式非常容易理解和实现。一般会有一个属性用来存放多个对象实例,以及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设计模式:桥接模式学习心得(附案例代码)
以上是内存溢出为你收集整理的使用注册树及工厂模式来替代使用单例模式实践(附案例)全部内容,希望文章能够帮你解决使用注册树及工厂模式来替代使用单例模式实践(附案例)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)