PHP设计模式_注册树模式

通过注册树模式可以更加简单快捷的获取对象,在某个地方实例化了一个对象,可以将这个对象“保存”起来(放入可以全局使用的数组里),用的时候只需要提供 保存对象的时候 的那个标识即可,解决全局共享和交换对象,直接从该数组上获取即可。

为什么要采用注册树模式?

单例模式解决的是如何在整个项目中创建唯一对象实例的问题,工厂模式解决的是如何不通过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);

相关推荐