什麼是註冊樹模式
註冊樹模式,也叫註冊器模式, 註冊模式。
註冊模式,解決全局共享和交換對象。已經創建好的對象,掛在某個全局可以使用的數組上, 在需要使用的時候,直接從該數組上獲取即可。將對象註冊到全局的樹上,任何地方都可以直接訪問。(有點類似單例模式)
爲什麼要採用註冊樹模式
單例模式解決的是如何在整個項目中創建唯一對象實例的問題, 工廠方法模式解決的是如何不通過new建立實例對象的方法.
那爲什麼還需要註冊樹模式呢?
首先, 單例模式創建以爲對象的過程本身還有一種判斷, 即判斷對象是否存在. 存在則返回對象, 否則創建並返回對象.
工廠方法模式更多考慮的是擴展維護的問題.
總的來說, 單例模式和工廠方法模式可以產生更加合理的對象.
那怎麼方便調用這些對象呢? 在項目內部如此建立的對象都是各自分散的, 不方便統籌管理, 註冊樹模式由此而生. 不管是通過單例模式還是工廠方法模式或者二者結合生成的對象, 都統統給添加到樹上. 需要使用某個對象的時候, 直接從樹上取一下就好. 這與管局變量$_GLOBALS
一樣的方便.
如何實現?
只要實現get
, set
, _unset
三個方法即可.
class Register {
protected static $objects;
//將對象註冊到全局的樹上
public static function set($alias, $object){
self::$objects[$alias] = $object;//將對象放到樹上
}
//獲取某個註冊到樹上的對象
public static function get($name){
return self::$objects[$name];
}
//移除某個註冊到樹上的對象
public static function _unset($alias){
//注意這個函數名不能使用php自帶的`unset`
unset(self::$objects[$alias]);
}
}
$animal = new Animal('dog');
//註冊
Register::set('dog', $animal);
//獲取
$dog = Register::get('dog');
//移除
Register::_unset('dog');