之前学习了工厂模式和单例模式,明白了他们的意义。
但是我们在之后的使用中会发现一个问题,在新建一个实例的时候还是需要调用一个单例或者工厂,之后还是造成了代码和耦合和不好处理。
下面开始说一下:
--
为什么使用注册树?
单例模式解决的了避免一个对象在多次创建时耗费的资源。只创建一个对象实例。
工厂模式是为了不直接通过 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。
--
感谢参考: