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