缘起宇轩阁 2019-12-30
通过注册树模式可以更加简单快捷的获取对象,在某个地方实例化了一个对象,可以将这个对象“保存”起来(放入可以全局使用的数组里),用的时候只需要提供 保存对象的时候 的那个标识即可,解决全局共享和交换对象,直接从该数组上获取即可。
为什么要采用注册树模式?
单例模式解决的是如何在整个项目中创建唯一对象实例的问题,工厂模式解决的是如何不通过new建立实例对象的方法。 那么注册树模式想解决什么问题呢? 在考虑这个问题前,我们还是有必要考虑下前两种模式目前面临的局限。 首先,单例模式创建唯一对象的过程本身还有一种判断,即判断对象是否存在。存在则返回对象,不存在则创建对象并返回。 每次创建实例对象都要存在这么一层判断。 工厂模式更多考虑的是扩展维护的问题。 总的来说,单例模式和工厂模式可以产生更加合理的对象。怎么方便调用这些对象呢?而且在项目内如此建立的对象好像散兵游勇一样,不便统筹管理安排啊。因而,注册树模式应运而生。不管你是通过单例模式还是工厂模式还是二者结合生成的对象,都统统给我“插到”注册树上。
//单例模式 class DataBase{ private static $ins; public static function getInstance(){ if(self::$ins instanceof self){ return self::$ins; } self::$ins = new self(); return self::$ins; } } //工厂模式 class Factory{ public static function createDb(){ $db = DataBase::getInstance(); Register::set("testdb",$db); return $db; } } //注册树模式 class Register{ protected static $object; public static function set($name,$obj){ self::$object[$name]=$obj; } public function get($name){ $obj=null; if(isset(self::$object[$name])){ $obj = self::$object[$name]; } return $obj; } } $objFact = new Factory(); $db = $objFact->createDb(); $objreg = new Register(); $objInfo = $objreg->get("testdb"); var_dump($objInfo);