php设计模式-注册树模式

php注册树模式

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();

本文为参考博友博客后编写,感谢博友:https://www.cnblogs.com/freelyflying/p/7019243.html

如有转载请注明出处:https://www.cnblogs.com/chrdai/p/11182796.html

posted @ 2019-07-14 00:21  Chrdai  阅读(426)  评论(0编辑  收藏  举报