简介
注册树模式
又称注册模式
或注册器模式
。注册树模式通过将对象实例注册到一棵全局的对象树上,需要的时候从对象树上采摘的模式设计方法。和果树不同的是,果子只能采摘一次,而注册树上的实例却可以无数次获取。
使用了注册树模式后,对于实例,我们能够更好地统筹管理安排,就像使用全局变量一样的方便实用。
实现
下面我以代码的形式向大家演示一下,详解请参照代码注释
代码:
<?php
header('Content-Type:text/html;charset=utf-8');
/**
* Class Register 注册树类
*/
class Register
{
// 树的枝干-用于储存树上的果实(实例)
public static $objects;
/**
* 将实例插入注册树中
*
* @param $alias 对象别名-注册树中的名称
* @param $object 对象实例
*/
public static function set($alias, $object)
{
self::$objects[$alias] = $object;
}
/**
* 从注册树中读取实例
*
* @param $alias 对象别名-注册树中的名称
*
* @return mixed 返回的对象实例
*/
public static function get($alias)
{
if (isset(self::$objects[$alias])) {
return self::$objects[$alias];
} else {
echo '您要找的对象实例不存在哦<br>';
}
}
/**
* 销毁注册树中的实例
*
* @param $alias 对象别名-注册树中的名称
*/
public static function _unset($alias)
{
unset(self::$objects[$alias]);
}
}
/**
* Class demo 演示类
*/
class demo
{
/*
* 测试方法
*/
public function test()
{
echo '看这里看这里<br><br>';
}
}
// 实例化测试类,获取对象实例
$demo = new demo();
// 注册到树上
$tree = Register::set('de', $demo);
// 取出来
$de_true = Register::get('de');
// 测试
$de_true->test();
// 销毁
Register::_unset('de');
// 尝试再次取出来
$de_true_two = Register::get('de');
// 尝试再次测试
$de_true_two->test();
运行结果:
// 第一次成功运行
看这里看这里
// 第二次销毁后找不到对象实例
您要找的对象实例不存在哦
// 第二次销毁后找不到对象实例,故无法调用对象方法,报错
Fatal error: Call to a member function test() on a non-object in E:\phpStudy\WWW\test\test.php on line 77
扩展
上面已经通过实例向大家展示了如何构建注册树模式,相信大家应该都明白了,那么下面我们就将注册树模式和工厂模式与单例模式结合起来,看看如何实现他们的代码
代码:
<?php
header('Content-Type:text/html;charset=utf-8');
/**
* Class Register 注册树类
*/
class Register
{
// 树的枝干-用于储存树上的果实(实例)
public static $objects;
/**
* 将实例插入注册树中
*
* @param $alias 对象别名-注册树中的名称
* @param $object 对象实例
*/
public static function set($alias, $object)
{
self::$objects[$alias] = $object;
}
/**
* 从注册树中读取实例
*
* @param $alias 对象别名-注册树中的名称
*
* @return mixed 返回的对象实例
*/
public static function get($alias)
{
if (isset(self::$objects[$alias])) {
return self::$objects[$alias];
} else {
echo '您要找的对象实例不存在哦<br>';
}
}
/**
* 销毁注册树中的实例
*
* @param $alias 对象别名-注册树中的名称
*/
public static function _unset($alias)
{
unset(self::$objects[$alias]);
}
}
/**
* Class demo 单例演示类
*/
class singleDemo
{
// 存放实例属性
public static $_instance;
public $content;
// 私有化构造函数,防止外部new
private function __construct($content)
{
$this->content = $content;
}
// 获取实例
public static function getInstance($content)
{
// 判断实例是否存在
if (!(self::$_instance instanceof self)) {
self::$_instance = new self($content);
}
return self::$_instance;
}
// 私有化克隆方法,防止克隆
private function __clone()
{
}
// 测试方法
public function test()
{
echo $this->content.'<br>';
}
}
/**
* Class factory 工厂类
*/
class Factory
{
// 生产
public static function create($content)
{
// 返回对象
return singleDemo::getInstance($content);
}
}
// 加入注册树
Register::set('si',Factory::create('我是content参数内容,哈哈'));
// 取出对象实例
$object = Register::get('si');
// 执行测试方法
$object->test();
// 打印对象
var_dump($object);
运行结果:
我是content参数内容,哈哈
object(singleDemo)#1 (1) { ["content"]=> string(34) "我是content参数内容,哈哈" }
地址
关于工厂模式和单例模式,之前的文章我也说过,如果有兴趣,可以从以下地址前往:
PHP设计模式之工厂模式:https://segmentfault.com/a/11…
PHP设计模式之单例模式:https://segmentfault.com/a/11…