it

今天在看thinkphp的的db核心文件的时候,注意到这么一点,就是在实例化数据库类的时候,thinkphp在这里使用了工厂模式,简化了操作,值得借鉴。
我们先说下什么是工厂模式。我理解的工厂模式,其实就是你可以通过一个function,来完成对很多个有共同点的类的实例化,是要传进去不同的参数就可以了~这样,你就不需要为每一个类都写一个实例化的function出来。
话不多说,我们开thinkphp中的相关源码。
public function factory($db_config='') {//一看到这个函数名字,基本上就能想到这里用的是工厂模式// 读取数据库配置$db_config = $this->parseConfig($db_config);if(empty($db_config['dbms']))throw_exception(L('_NO_DB_CONFIG_'));// 数据库类型$this->dbType = ucwords(strtolower($db_config['dbms']));$class = 'Db'. $this->dbType;if(is_file(CORE_PATH.'Driver/Db/'.$class.'.class.php')) {// 内置驱动$path = CORE_PATH;}else{ // 扩展驱动$path = EXTEND_PATH;}// 检查驱动类if(require_cache($path.'Driver/Db/'.$class.'.class.php')) {$db = new $class($db_config);//工厂模式的核心语句// 获取当前的数据库类型if( 'pdo' != strtolower($db_config['dbms']) )$db->dbType = strtoupper($this->dbType);else$db->dbType = $this->_getDsnType($db_config['dsn']);if(APP_DEBUG)$db->debug = true;}else {// 类没有定义throw_exception(L('_NOT_SUPPORT_DB_').': ' . $db_config['dbms']);}return $db;}
大家可以看到,这里面只需要传入参数,就可以对应的实例化相应db驱动下的类,来完成数据库对象的实例化,非常的方便。这里我在想,其实每个数据库驱动类的对象,都可以做成单例模式,这样,就是把工厂模式和单利模式结合起来~相对方便。