PHP設計模式_註冊樹模式

OldBoy~發表於2018-02-01

通過註冊樹模式可以更加簡單快捷的獲取物件,在某個地方例項化了一個物件,可以將這個物件“儲存”起來(放入可以全域性使用的陣列裡),用的時候只需要提供 儲存物件的時候 的那個標識即可,解決全域性共享和交換物件,直接從該陣列上獲取即可。

為什麼要採用註冊樹模式?

單例模式解決的是如何在整個專案中建立唯一物件例項的問題,工廠模式解決的是如何不通過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);

三種模式設計的結合使用,各種模式設計本身就會相輔相成。

相關文章