PHP工厂模式
为什么使用工厂模式:
在多个程序员进行一个大型项目时,经常会用到一个类,但是会加入不同的参数(比如数据库操作类),比较让人害怕的问题是,在项目完成度很高的时候,突然修改这个基类的类名或参数,会让之后的所有的对象都不可用,于是所有人又得修改他们之前的代码,采用工厂模式可以解决这个问题
工厂模式:
在实例化对象之前,使用一个工厂类静态示例化这个类,所有人都调用这个工厂类的静态方法,即使原本的类出现变化,只需要在这个工厂类修改,就可以避免所有人的代码报错
代码:
1 header("Content-type:text/html;charset=utf-8"); 2 interface db{ 3 4 function select($sql); 5 function query($sql); 6 7 } 8 class basedb implements db{ 9 10 public function __construct($db){ 11 12 $conn = mysql_connect('localhost','root','root'); 13 if(!$conn){ 14 die(mysql_error()); 15 } 16 mysql_select_db($db); 17 mysql_query("Set Names 'utf8'"); 18 } 19 public function select($sql){ 20 21 $res = mysql_query($sql); 22 $arr = array(); 23 while($row = mysql_fetch_assoc($res)){ 24 $arr[] = $row; 25 } 26 return $arr; 27 } 28 public function query($sql){ 29 30 $res = mysql_query($sql); 31 if(!$res){ 32 die(mysql_error()); 33 }else{ 34 return true; 35 } 36 } 37 } 38 class factory{ 39 40 public static function getdb($db){ 41 42 return new basedb($db); 43 44 } 45 } 46 $a = factory::getdb('user'); 47 $user = $a->select("select * from user"); 48 var_dump($user); 49 50 $b = factory::getdb('test'); 51 $result = $b->query("insert into test(`title`,`content`)values('123','ABC')"); 52 var_dump($result);
在以上代码中,可能觉得工厂类操作很多余,完全可以直接示例化,但是如果多个模块都有示例化的操作,而我们因为一些原因修改了类名,会导致所有有关这个类的代码全部失效,为了避免这个问题,可以通过上面的工厂类来形成一种过渡缓冲的作用。
单例模式与工厂模式的区别:
单例模式适用那些参数固定且出现次数多的类。
工厂模式适用参数不固定且出现次数多的类。