简单工厂模式

简单工厂模式:提供获取某个类的新实例的一个接口,同时使调用代码避免确定实际实例化基类的步骤

请看下面代码

<?php 
	class mysql_DB{	}
	class sqlite_DB{ }
	class pdo_DB{ }

	class Factory{
		public static function getDB($type){
			if(strtolower($type)=='mysql'){
				return new mysql_DB();
			} else if(strtolower("sqlite")=="sqlite") {
				return new sqlite_DB();
			} else {
				return new pdo_DB();
			}
			
			//或者用下面的代码实现:
			// $type=strtolower($type)."_DB";
			// return new $type();
		}
	}

	$a=Factory::getDB("sqlite");
	var_dump($a);//object(sqlite_DB)#1 (0) { } 

	$b=Factory::getDB("mysql");
	var_dump($b);//object(mysql_DB)#2 (0) { }
 ?>

如果不将Factory中的代码封装一下的话,那么在每次要实例化对象时,都得有那么多行的if..else if ...或者switch/case来判断到底要实例化哪个对象;

如果有一百个页面都要实例化这类对象,如果不封装,那这么多的判断条件就得写100次,一方面,这么多代码写着也挺浪费时间的(有时候if/else if或者switch/case多达几十个),就算你复制粘贴一百次也是一样;另一方面,一旦要修改这些判断中的某条语句,那么100个页面就得挨个修改,哪怕之后只增加一个两三行的判断。

所以可以这些判断进行封装,封装在一个工厂类的静态方法中,这个通过调用这个工厂中的静态方法(也就是工厂类提供给外界一个接口),然后获得一个新实例的对象,不用每次都写一次判断,减少了很多步骤,这就减少了很多错误的发生,还便于修改。在其他页面中,直接用include包含这个文件即可。

 

简单工厂有一定的局限,可以看另一篇博文:工厂模式

posted @ 2017-10-27 23:29  寻觅beyond  阅读(198)  评论(0编辑  收藏  举报
返回顶部