php注册树模式
什么是注册树模式?
- 通过将对象实例注册到全局对象树上,需要的时候将对象从全局对象树上取下来,就像小时候买糖葫芦一样,卖糖葫芦的将糖葫芦插在一个大的杆子上,人们买的时候就取下来,不同的是,注册树模式摘下来还会有,能摘很多次,糖葫芦摘一次就没了,嘿嘿。
//将工厂和单例生成的数据库对象注册到“注册树”上 Register::set('signal', MysqlFactory::factory('Pdo')); $signal = Register::get('signal'); $signal->connect();
- 单例模式解决了在整个项目中创建唯一对象的问题,
- 工厂模式解决了不通过new解决实例对象的问题,考虑的是项目扩展与维护。
- 总得来说单例模式和工厂模式可以产生更加合理的对象,
- 那么怎么方便统筹调用这些对象呢,这时候就用到了注册树模式,不管你是单例模式,工厂模式还是二者结合生成的对象,都统统给我注册到树上,用某个对象的时候,直接从树上取下来就好。
如何实现注册树
- 一个静态变量,用于将所有的对象“插入”到注册树上,而且这个注册树应该是一个二维数组。
- 一个插入对象实例的方法set()。
- 一个撤销对象实例的方法unset()。
- 一个读取对象的方法get()。
代码
/**
* @purpose: 创建一个单例类
* Class Single
*/
class Single
{
/**
* @var Object 保存类实例的静态成员变量
*/
private static $_instance;
/**
* Single constructor. 私有的构造方法
*/
private function __construct()
{
echo 'This is a Constructed method;';
}
/**
* @purpose: 创建__clone方法防止对象被复制克隆
*/
public function __clone()
{
trigger_error('Clone is not allow!', E_USER_ERROR);
}
/**
* @return Single|Object 单例方法,用于访问实例的公共的静态方法
*/
public static function getInstance()
{
if (!(self::$_instance instanceof self)) {
self::$_instance = new self;
}
return self::$_instance;
}
}
/**
* @purpose: 创建一个工厂类
* Class mysqlFactory
*/
class MysqlFactory
{
static public function factory($className)
{
return new $className();
}
}
interface Mysql
{
public function connect();
}
class Mysqli implements mysql
{
public function connect()
{
echo 'mysqli';
}
}
class Pdo implements mysql
{
public function connect()
{
echo 'pdo';
}
}
/**
* @purpose: 创建一个注册树模式
* Class Register
*/
class Register
{
/**
* @var array 将所有的对象“插入”到注册树上
*/
protected static $objects;
/**
* 插入对象实例
* @param string $alias
* @param object $object 对象实例
*/
public static function set($alias, $object)
{
self::$objects[$alias] = $object;
}
/**
* 撤销对象实例
* @param string $alias
*/
public static function unset($alias)
{
unset(self::$objects[$alias]);
}
/**
* 获取对象实例
* @param string $alias
* return object
*/
public static function get($alias)
{
return self::$objects[$alias];
}
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: