说完了单例模式和工厂模式,现在来说说注册模式,据我自己看完注册模式的第一印象就是全局调用,不过他的用途不止这一点,现在依然先声明一个Cat类并运用单例模式和工厂模式实现实例化
class Cat{
private static $cat;
private function __construct(){
}
static function getInstance(){
if(empty(self::$cat)){
self::$cat = new self;
return self::$cat;
}else{
return self::$cat;
}
}
}
class Factory{
static function createCat(){
$cat = Cat::getInstance();
return $cat;
}
}
那么每次我们调用的createCat方法的时候,都会对是否实例化进行一次判断,在这种情况就可以用注册树模式优化处理如下
class Register{
private static $obj;
static function set($key, $value){
self::$obj[$key] = $value;
}
static function get($key){
return self::$obj[$key];
}
function _unset($key){
unset(self::$obj[$key]);
}
}
再对Factory类的createCat方法稍作修改
static function createCat(){
$cat = Cat::getInstance();
Register::set('cat', $cat);
return $cat;
}
这样以后再需要cat实例的时候,只需要Register::get('cat')即可,方便实用。
我们再继续讨论全局调用的问题,譬如之前写的一个项目,在一个函数中获取到一个价格的值需要在另一个文件中调用,那么一个方法就是先在类中声明一个静态变量,然后在函数中赋值,还有一种就是用注册树来实现了,直接将值赋值在一个文件中再在另一个文件中取出即可,避免了在类中继续声明变量