栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > PHP

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

PHP 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

今天在考高分网和大家介绍下一种结构型设计模式——注册树模式,别名注册器模式或注册模式,它是用来保存程序中经常使用的对象的实例。注册树模式通过将对象实例注册到一棵全局的对象树上,需要的时候从对象树上采摘。但和现实中的采摘不同的是,从对象树上摘下来的果子依旧存在对象树上,下次还可以继续摘。

实现代码

注册器模式非常容易理解和实现。一般会有一个属性用来存放多个对象实例,以及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设计模式:桥接模式学习心得(附案例代码)

以上就是使用注册树及工厂模式来替代使用单例模式实践(附案例)的详细内容,更多请关注考高分网其它相关文章!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/262768.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号