1. 概念

    注册树模式也叫注册模式或注册器模式,顾名思义,注册树就是把对象实例注册到一棵全局的对象树上,需要对象的时候就从树上取下来,就好比树上长的果子,需要的时候就摘一个下来,只是这个对象树果子是摘不完的。

  2. 作用

    不管是单例模式还是工厂模式建立的对象,都没有得到很好的管理,用了注册树模式,就可以把创建出来的对象注册到全局树上,需要的时候取下来用,可以很好的管理创建的对象。

<?php
class DbMysql
{
    public function conn()
    {
        echo 'mysql conn';
    }
}

class DbSqlite
{
    public function conn()
    {
        echo 'sqlite conn';
    }
}

class MysqlFactory
{
    public static function getIns()
    {
        return new DbMysql();
    }
}

class SqliteFactory
{
    public static function getIns()
    {
        return new DbSqlite();
    }
}

//注册树实现存储对象(IOC控制反转思想)
class RegisterTree
{
    protected static $objects;
    //添加对象到注册树中
    public static function set($alias, $object)
    {
        self::$objects[$alias] = $object;
    }

    //从注册树中获取对象
    public static function get($alias)
    {
        return self::$objects[$alias];
    }

    //销毁注册树上的对象
    public static function _unset($alias)
    {
        unset(self::$objects[$alias]);
    }
}

//注册
RegisterTree::set('mysql', MysqlFactory::getIns());
RegisterTree::set('sqlite', SqliteFactory::getIns());

//客户端
// $mysql = RegisterTree::get('mysql');
// $mysql->conn();

// $sqlite = RegisterTree::get('sqlite');
// $sqlite->conn();

class Facade
{
    public static $mysql;
    public static $sqlite;

    public function __construct()
    {

        self::$mysql = RegisterTree::get('mysql');
        self::$sqlite = RegisterTree::get('sqlite');
    }
}

new Facade();
Facade::$mysql->conn();
Facade::$sqlite->conn();