1、什麼是註冊樹模式?
- 註冊樹模式通過將物件例項註冊到全域性物件樹上,需要的時候將物件從全域性物件樹上取下來,就像小時候買糖葫蘆一樣,賣糖葫蘆的將糖葫蘆插在一個大的杆子上,人們買的時候就取下來,不同的是,註冊樹模式摘下來還會有,能摘很多次,糖葫蘆摘一次就沒了,嘿嘿。
2、為什麼要用工廠模式?
前面講到的單例模式解決了在整個專案中建立唯一物件的問題,
工廠模式解決了不通過new解決例項物件的問題,考慮的是專案擴充套件與維護。
總得來說單例模式和工廠模式可以產生更加合理的物件,
那麼怎麼方便統籌呼叫這些物件呢,這時候就用到了註冊樹模式,不管你是單例模式,工廠模式還是二者結合生成的物件,都統統給我註冊到樹上,用某個物件的時候,直接從樹上取下來就好。
3、如何實現註冊樹
我們用“四個一”來記
- 一個靜態變數**,用於將所有的物件“插入”到註冊樹上,而且這個註冊樹應該是一個二維陣列。
- 一個插入物件例項的方法**(set()),
- 一個撤銷物件例項的方法**(_unset())。
- 一個讀取物件的方法**(get())。
4、程式碼示例
/**
* @purpose: 建立一個單例類
* Class Single
*/
class Single
{
/**
* @var Object 儲存類例項的靜態成員變數
*/
private static $_instance;
/**
* Single constructor. 私有的構造方法
*/
private function __construct()
{
echo 'This is a Constructed method;';
}
/**
* @purpose: 建立__clone方法防止物件被複制克隆
*/
public function __clone()
{
trigger_error('Clone is not allow!',E_USER_ERROR);
}
/**
* @return Single|Object 單例方法,用於訪問例項的公共的靜態方法
*/
public static function getInstance()
{
if (!(self::$_instance instanceof self)) {
self::$_instance = new self;
}
return self::$_instance;
}
}
/**
* @purpose: 建立一個工廠類
* Class mysqlFactory
*/
class MysqlFactory
{
static public function factory($className)
{
return new $className();
}
}
interface Mysql
{
public function connect();
}
class Mysqli implements mysql
{
public function connect()
{
echo 'mysqli';
}
}
class Pdo implements mysql
{
public function connect()
{
echo 'pdo';
}
}
/**
* @purpose: 建立一個註冊樹模式
* Class Register
*/
class Register
{
/**
* @var array 將所有的物件“插入”到註冊樹上
*/
static protected $objects;
/**
* 插入物件例項
* @param string $alias
* @param object $object 物件例項
*/
public static function set($alias,$object)
{
self::$objects[$alias]=$object;
}
/**
* 撤銷物件例項
* @param string $alias
*/
public static function _unset($alias)
{
unset(self::$objects[$alias]);
}
/**
* 獲取物件例項
* @param string $alias
* return object
*/
public static function get($alias)
{
return self::$objects[$alias];
}
}
//將工廠和單例生成的資料庫物件註冊到“註冊樹”上
Register::set('signal',MysqlFactory::factory('Pdo'));
$signal = Register::get('signal');
$signal->connect();
本作品採用《CC 協議》,轉載必須註明作者和本文連結