常用設計模式之PHP實現: 註冊樹模式

什麼是註冊樹模式

註冊樹模式,也叫註冊器模式, 註冊模式。

註冊模式,解決全局共享和交換對象。已經創建好的對象,掛在某個全局可以使用的數組上, 在需要使用的時候,直接從該數組上獲取即可。將對象註冊到全局的樹上,任何地方都可以直接訪問。(有點類似單例模式)

爲什麼要採用註冊樹模式

單例模式解決的是如何在整個項目中創建唯一對象實例的問題, 工廠方法模式解決的是如何不通過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');
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章