2018/04/24 PHP 设计模式之注册树模式

之前学习了工厂模式和单例模式,明白了他们的意义。

但是我们在之后的使用中会发现一个问题,在新建一个实例的时候还是需要调用一个单例或者工厂,之后还是造成了代码和耦合和不好处理。

下面开始说一下:

--

为什么使用注册树?

  单例模式解决的了避免一个对象在多次创建时耗费的资源。只创建一个对象实例。

  工厂模式是为了不直接通过 new 创建对象的方法。避免代码高度耦合。

  在两种模式的存在下,我们更应该去统筹管理这些,不让其游荡在程序的各个角落。

  于是在这里引入了注册树模式,不管你是怎样产生的对象,都会在 ‘树’ 上注册,在使用某个对象时候,直接从 ‘树’ 上拿下来就可以。 

  这和我们使用全局变量一样的方便实用。 而且注册树模式还为其他模式提供了一种非常好的想法。

--

实现注册树

  明白了注册树的实现原理之后,代码可以其实可以有多种多样的,这里写一种集合单例和工厂模式挂在注册树上的

  

创建一个需要实例化的类
class test{}

创建单例模式
class Single
{
	private function __construct() {}

	public static function getInstance() {

        static $_test;

        if (empty($_test)) {
            $_test = new test();
        }

        return $_test;
    }
}


//工厂模式
class MyFactory
{
    public static function factory() {
        return Single::getInstance();
    }
}

//注册树
class Register{
    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]);
    }
}

// 把需要的类注册到我们的注册表中
Register::set('test', MyFactory::factory());

// 获取注册的类
$test = Register::get('test');

这样我们就得到了 test() 的实例化类,虽然这样会比较麻烦,但是随着方法的增多,实例化的增大,就会发现他的好处和优势。

我们在这里给与了实例化一个很好的基类来实现 new。

--

感谢参考:

  php模式设计之 注册树模式

原文地址:https://www.cnblogs.com/25-lH/p/8931900.html