註冊樹模式
又稱註冊模式
或註冊器模式
。註冊樹模式經過將對象實例註冊到一棵全局的對象樹上,須要的時候從對象樹上採摘的模式設計方法。和果樹不一樣的是,果子只能採摘一次,而註冊樹上的實例卻能夠無數次獲取。php
使用了註冊樹模式後,對於實例,咱們可以更好地統籌管理安排,就像使用全局變量同樣的方便實用。html
下面我以代碼的形式向你們演示一下,詳解請參照代碼註釋segmentfault
代碼:設計模式
<?php header('Content-Type:text/html;charset=utf-8'); /** * Class Register 註冊樹類 */ class Register { // 樹的枝幹-用於儲存樹上的果實(實例) public static $objects; /** * 將實例插入註冊樹中 * * @param $alias 對象別名-註冊樹中的名稱 * @param $object 對象實例 */ public static function set($alias, $object) { self::$objects[$alias] = $object; } /** * 從註冊樹中讀取實例 * * @param $alias 對象別名-註冊樹中的名稱 * * @return mixed 返回的對象實例 */ public static function get($alias) { if (isset(self::$objects[$alias])) { return self::$objects[$alias]; } else { echo '您要找的對象實例不存在哦<br>'; } } /** * 銷燬註冊樹中的實例 * * @param $alias 對象別名-註冊樹中的名稱 */ public static function _unset($alias) { unset(self::$objects[$alias]); } } /** * Class demo 演示類 */ class demo { /* * 測試方法 */ public function test() { echo '看這裏看這裏<br><br>'; } } // 實例化測試類,獲取對象實例 $demo = new demo(); // 註冊到樹上 $tree = Register::set('de', $demo); // 取出來 $de_true = Register::get('de'); // 測試 $de_true->test(); // 銷燬 Register::_unset('de'); // 嘗試再次取出來 $de_true_two = Register::get('de'); // 嘗試再次測試 $de_true_two->test();
運行結果:函數
// 第一次成功運行 看這裏看這裏 // 第二次銷燬後找不到對象實例 您要找的對象實例不存在哦 // 第二次銷燬後找不到對象實例,故沒法調用對象方法,報錯 Fatal error: Call to a member function test() on a non-object in E:\phpStudy\WWW\test\test.php on line 77
上面已經經過實例向你們展現瞭如何構建註冊樹模式,相信你們應該都明白了,那麼下面咱們就將註冊樹模式和工廠模式與單例模式結合起來,看看如何實現他們的代碼測試
代碼:this
<?php header('Content-Type:text/html;charset=utf-8'); /** * Class Register 註冊樹類 */ class Register { // 樹的枝幹-用於儲存樹上的果實(實例) public static $objects; /** * 將實例插入註冊樹中 * * @param $alias 對象別名-註冊樹中的名稱 * @param $object 對象實例 */ public static function set($alias, $object) { self::$objects[$alias] = $object; } /** * 從註冊樹中讀取實例 * * @param $alias 對象別名-註冊樹中的名稱 * * @return mixed 返回的對象實例 */ public static function get($alias) { if (isset(self::$objects[$alias])) { return self::$objects[$alias]; } else { echo '您要找的對象實例不存在哦<br>'; } } /** * 銷燬註冊樹中的實例 * * @param $alias 對象別名-註冊樹中的名稱 */ public static function _unset($alias) { unset(self::$objects[$alias]); } } /** * Class demo 單例演示類 */ class singleDemo { // 存放實例屬性 public static $_instance; public $content; // 私有化構造函數,防止外部new private function __construct($content) { $this->content = $content; } // 獲取實例 public static function getInstance($content) { // 判斷實例是否存在 if (!(self::$_instance instanceof self)) { self::$_instance = new self($content); } return self::$_instance; } // 私有化克隆方法,防止克隆 private function __clone() { } // 測試方法 public function test() { echo $this->content.'<br>'; } } /** * Class factory 工廠類 */ class Factory { // 生產 public static function create($content) { // 返回對象 return singleDemo::getInstance($content); } } // 加入註冊樹 Register::set('si',Factory::create('我是content參數內容,哈哈')); // 取出對象實例 $object = Register::get('si'); // 執行測試方法 $object->test(); // 打印對象 var_dump($object);
運行結果:設計
我是content參數內容,哈哈 object(singleDemo)#1 (1) { ["content"]=> string(34) "我是content參數內容,哈哈" }
關於工廠模式和單例模式,以前的文章我也說過,若是有興趣,能夠從如下地址前往:code
PHP設計模式之工廠模式:https://segmentfault.com/a/11...htm
PHP設計模式之單例模式:https://segmentfault.com/a/11...