通過註冊樹模式可以更加簡單快捷的獲取物件,在某個地方例項化了一個物件,可以將這個物件“儲存”起來(放入可以全域性使用的陣列裡),用的時候只需要提供 儲存物件的時候 的那個標識即可,解決全域性共享和交換物件,直接從該陣列上獲取即可。
為什麼要採用註冊樹模式?
單例模式解決的是如何在整個專案中建立唯一物件例項的問題,工廠模式解決的是如何不通過new建立例項物件的方法。 那麼註冊樹模式想解決什麼問題呢? 在考慮這個問題前,我們還是有必要考慮下前兩種模式目前面臨的侷限。 首先,單例模式建立唯一物件的過程本身還有一種判斷,即判斷物件是否存在。存在則返回物件,不存在則建立物件並返回。 每次建立例項物件都要存在這麼一層判斷。 工廠模式更多考慮的是擴充套件維護的問題。 總的來說,單例模式和工廠模式可以產生更加合理的物件。怎麼方便呼叫這些物件呢?而且在專案內如此建立的物件好像散兵遊勇一樣,不便統籌管理安排啊。因而,註冊樹模式應運而生。不管你是通過單例模式還是工廠模式還是二者結合生成的物件,都統統給我“插到”註冊樹上。
<?php
//單例類
class DataBase{
private $ins;
static public function getInstance(){
if (self::$ins instanceof self) {
return self::$ins;
}
self::$ins=new self();
return self::$ins;
}
}
//工廠類
class Factory {
static function createDatabase () {
$db = DataBase::getInstance();
Register::set('testDb', $db);
return $db;
}
}
//註冊器類
class Register{
protected static $objects;
function set($alias, $object)//將物件註冊到全域性的樹上
{
self::$objects[$alias] = $object;//將物件放到樹上
}
static function get($name){
return self::$objects[$name];//獲取某個註冊到樹上的物件
}
function _unset($alias)
{
unset(self::$objects[$alias]);//移除某個註冊到樹上的物件。
}
}
$db = Register::get('testDb');
var_dump($db);
三種模式設計的結合使用,各種模式設計本身就會相輔相成。