這種模式比較簡單好理解,在PHP框架中會經常用到,在某些比較大的PHP框架中,會在初始化時將一些常用的類實例放在注冊器中,實際是存在注冊器類中的一個靜態數組中,以後想去用它的話,直接根據名稱就可以獲取到注冊器中保存的實例。而不需要再次去new這個類、getInstance或者工廠方法獲得。我感覺這種模式有點像是把單例模式和簡單工廠模式結合起來了,實例化之後保存在一個靜態數組中(類似單例模式的靜態變量),然後可以根據不同的參數去獲取注冊過的實例,這裡跟簡單工廠模式相比較的話,他可以動態的添加實例進去,而不需要去修改代碼,但這裡要注意的就是必須先注冊才可以獲取。
這個模式要注意幾個要點:
1. 首先就是要一個管理要注冊的實例的類(例如:Register),我們就加他注冊類吧。
2. 這個注冊類必須有一個靜態數組變量,采用鍵值數組(哈希)方式存儲這些注冊的實例,其中鍵對應實例名,值對應實例。
3. 當然了,_set、_get、_unset(采用下劃線開始僅僅是因為unset是關鍵字,然後為了統一,就都加上了)這些方法都不能少,用來設置、獲取、和銷毀注冊器中的內容。
4. 其實這個注冊類可以看做是一個裝載和卸載的過程,使用前進行裝載,當這個實例不在使用時就可以卸載了。
4. 這裡還需要注意,不能放太多的實例進去,有些實例用一次就可以銷毀掉了就不用保存到注冊器中,免得浪費空間。
5. 注冊器中不同的名稱是可以保存相同的實例的,因為他保存時是有名稱作為索引。
<?php /** * 注冊器模式——例子 * @author 燕睿濤([email protected]) */ class Register{ /** * @var array $objects * 用來保存注冊過的實例的變量 */ private static $_objects = array(); /** * 注冊一個實例到注冊器中 * @param string $name 要注冊的類名 * @param object $obj 要注冊的類實例 * @return true */ public static function _set($name,$obj){ if(!isset(self::$_objects[$name])){ self::$_objects[$name] = $obj; } return true; } /** * 從注冊器中解除一個實例 * @param string $name 要注冊的類名 * @return true */ public static function _unset($name){ if(isset(self::$_objects[$name])){ unset(self::$_objects[$name]); } return true; } /** * 從注冊器中獲取一個實例 * @param string $name 要注冊的類名 * @return object/false */ public static function _get($name){ if(isset(self::$_objects[$name])){ return self::$_objects[$name]; } return false; } } class Man{ public function say(){ echo "My name is Users!!"; } } Register::_set('man1',new Man()); Register::_get('man1')->say();
send Me~