php注册树模式

什么是注册树模式?

  • 通过将对象实例注册到全局对象树上,需要的时候将对象从全局对象树上取下来,就像小时候买糖葫芦一样,卖糖葫芦的将糖葫芦插在一个大的杆子上,人们买的时候就取下来,不同的是,注册树模式摘下来还会有,能摘很多次,糖葫芦摘一次就没了,嘿嘿。
    //将工厂和单例生成的数据库对象注册到“注册树”上
    Register::set('signal', MysqlFactory::factory('Pdo'));
    $signal = Register::get('signal');
    $signal->connect();
  • 单例模式解决了在整个项目中创建唯一对象的问题,
  • 工厂模式解决了不通过new解决实例对象的问题,考虑的是项目扩展与维护。
  • 总得来说单例模式和工厂模式可以产生更加合理的对象,
  • 那么怎么方便统筹调用这些对象呢,这时候就用到了注册树模式,不管你是单例模式,工厂模式还是二者结合生成的对象,都统统给我注册到树上,用某个对象的时候,直接从树上取下来就好。

如何实现注册树

  • 一个静态变量,用于将所有的对象“插入”到注册树上,而且这个注册树应该是一个二维数组。
  • 一个插入对象实例的方法set()。
  • 一个撤销对象实例的方法unset()。
  • 一个读取对象的方法get()。

代码

/**
 * @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 将所有的对象“插入”到注册树上
     */
    protected static $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];
    }
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!