php註冊樹模式

MaChao發表於2020-10-27

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 協議》,轉載必須註明作者和本文連結

相關文章