什么是注册树模式?
注册树模式通过将对象实例注册到全局对象树上,需要的时候将对象从全局对象树上取下来
为什么要用工厂模式?
前面讲到的单例模式解决了在整个项目中创建唯一对象的问题,工厂模式解决了不通过new解决实例对象的问题,考虑的是项目扩展与维护。总得来说单例模式和工厂模式可以产生更加合理的对象,那么怎么方便统筹调用这些对象呢,这时候就用到了注册树模式,不管你是单例模式,工厂模式还是二者结合生成的对象,都统统给我注册到树上,用某个对象的时候,直接从树上取下来就好。
示例代码
<?php
/**
* 单例模式
*/
class Signal
{
static private $_instance;
final protected function __construct()
{
# code...
}
public static function getInstance()
{
if (!self::$_instance instanceof self) {
self::$_instance=new Signal();
}
return self::$_instance;
}
public function connect()
{
//链接数据库
}
}
/**
* 工厂模式
*/
class Db
{
public static function factory($param='')
{
switch ($param) {
case 'mysql':
return new Class1();
break;
case 'mysqli':
return new Class2();
break;
case 'mssql':
return new Class3();
break;
default:
return Signal::getInstance();
}
}
}
interface Connect
{
public function fun1($param);
}
class Class1 implements Connect
{
public function fun1($param)
{
//具体实现
}
}
class Class2 implements Connect
{
public function fun1($param)
{
//具体实现
}
}
class Class3 implements Connect
{
public function fun1($param)
{
//具体实现
}
}
/**
*注册树模式
*/
class Register
{
static protected $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];
}
}
Register::set('signal',Db::factory());
$signal=Register::get('signal');
$signal->connect();
?>