明凯博客

关注网站技术,一个特立独行的程序员

PHP面对对象设计模式之注册模式

也叫注册树模式(Registry Pattern ):注册树模式为应用中经常使用的对象创建一个中央存储器来存放这些对象,通常通过一个只包含静态方法的抽象类来实现(或者通过单例模式),也叫做注册器模式。

注册模式的原理:

注册模式在单例模式的基础上进一步拓展了一步,他把所有单例模式的对象全部保存在一个索引数组中,下次取得时候,直接去数组里按照索引去取。这样的好处是在程序中有条理的存放并管理对象。
所以,肯定有一个存(set)和一个取(get)。
一般是先去取如果没有,就重新初始化然后存起来,这样这个周期中的其他代码就可以直接取了,和redis缓存的道理是一样的。

注册模式的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
< ?php
// User类用于测试
class User{
    public function getName()
    {
        echo '我是明凯博客<br>';
    }
}
// 注册树类
class Register
{
    // 用于存放实例
    protected static $objects;  
    // 存入实例方法
    static public function set($key, $object)
    {
        self::$objects[$key] = $object;
    }
    // 获取实例方法
    static public function get($key)
    {
        if (!isset(self::$objects[$key]))
        {
            echo '对象实例不存在<br />';
            return false;
        }
        return self::$objects[$key];
    }
    // 删除实例方法
    static public function _unset($key)
    {
        unset(self::$objects[$key]);
    }
}
 
$user = new User;
// 存进去
$tree = Register::set('User',$user);
// 取出来
$treeUser = Register::get('User');
$treeUser->getName();
// 删除实例
Register::_unset('User');
// 再次取出来
$treeUser = Register::get('User');
$treeUser->getName();

我是明凯博客
对象实例不存在
Fatal error: Uncaught Error: Call to a member function getName() on boolean in /Users/mk/www/test/register.php on line 46
Error: Call to a member function getName() on boolean in /Users/mk/www/test/register.php on line 46

注册模式的用处:
在我们的项目当中,像mysql连接,redis连接,配置文件等,都是在各个地方被大量使用的,我们都可以使用注册模式,将这些变量对象写到注册器上面去。
有些时候我们还可以这样做,让get方法如果get不到实例的时候就自动new一个存放起来,这样我们使用时就不用管有没有存放过这个实例,反正没有的话get方法也会帮我们存放。

1
2
3
4
5
6
7
8
9
  // 获取实例方法
    static public function get($key)
    {
        if (!isset(self::$objects[$key]))
        {
            self::$objects[$key] = new $key;
        }
        return self::$objects[$key];
    }

这张方法是不是和单里模式一模一样呢?当然使用这种方式的话,就可以不用写set方法了。

, , ,

相关文章

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注