自己写的一个比较简洁直观的数据库工厂连接类,结合了单例模式和工厂模式
这样查询数据正常,但是不知道合理不?final class db_factory {
 
 private static $instance; 
 protected $db;
 
 /**
  * 返回数据库连接类对象的实例 
  * @return object
  */
 public static function get_instance($database = '') {
  
  if (!isset(self::$instance)) {
   self::$instance = new self();   
   
   if ($databse == '') {
    $database = $GLOBALS['database'];   
   }
   $object = null; 
   switch($database['type']) {
    case 'mysql' :
     require_once 'mysql.class.php';
     $object = new mysql();
     break;
    case 'mysqli' :
     require_once 'mysqli.class.php';
     $object = new mysqli();
     break;
    default :
     require_once 'mysql.class.php';
     $object = new mysql();
   }  
   $object->open($database);
   self::$instance->db = $object;   
  } 
   
  return self::$instance->db;
 }
}调用的时候这样 $db = db_factory::get_instance();

解决方案 »

  1.   

    假如我要切换到sqlite,这个代码肯定得加一个case,不如舍弃switch,直接利用$database['type']作为类文件名的一部分require_once $database['type'].'.class.php';
    $object = new $database['type']();
      

  2.   


    switch($database['type']) {
      case 'mysql' :
      require_once 'mysql.class.php';
      $object = new mysql();
      break;
      case 'mysqli' :
      require_once 'mysqli.class.php';
      $object = new mysqli();
      break;
      default :
      require_once 'mysql.class.php';
      $object = new mysql();
      }   
      $object->open($database);
      self::$instance->db = $object;   
      }  工具类里不应该有switch的,而应该是根据传入的参数动态调用所需要的数据库类,可以考虑使用XML配置文件映射参数和对应的数据库访问类名来完成这个功能