微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP 工厂模式 价值理解和简单实例

工厂模式价值:

  1. 减少类之间的耦合
  2. 提高类的复用性

工厂模式(Factory)允许在代码执行时实例化对象。之所以被称为工厂模式是因为它负责“生产”对象。以数据库为例,工厂需要的就是根据不同的参数,生成不同的实例化对象。它只负责生产对象,而不负责对象的具体内容

定义一个适配器接口:

<?PHP
interface DbAdapter 
{
    /**
    * 数据库连接
    * @param $config 数据库配置
    * @return resource
    */
    public function connect($config);
    
    /**
    * 执行数据库查询
    * @param string $query 数据库查询sql字符串
    * @param mixed $handle 连接对象
    * @return resource
    */
    public function query($query, $handle);
}

  

定义MysqL数据库操作类:

<?PHP
class DbAdapterMysqL implements DbAdapter
{
    private $_dbLink; //数据库连接字符串表示

    /**
    * 数据库连接函数
    * @param $config 数据库配置
    * @throws DbException
    * @return resource
    */
    public function connect($config)
    {
        if($this->_dbLink = @MysqL_connect($config->host .
            (empty($config->port) ? '' : ':' . $config->port),
        $config->user, $config->password, true)) {
            if(@MysqL_select_db($config->database, $this->_dbLink)){
                if($config->charset){
                    MysqL_query("SET NAMES '{$config->charset}'", $this->_dbLink);
                }
                return $this->_dbLink;
            }
        }
        //数据库异常
        throw new DbException(@MysqL_error($this->_dbLink));
    }
    
    /**
    * 执行数据库查询
    * @param string $query 数据库查询sql字符串
    * @param mixed $handle 连接对象
    * @return resource
    */
    public function query($query, $handle)
    {
        if ($resource = @MysqL_query($query, $handle)) {
            return $resource;
        }
    }
}

  

sqlite数据库操作类:

<?PHP
class DbAdaptersqlite implements DbAdapter
{
    private $_dbLink;
    
    /**
    * 数据库连接函数
    * @param $config 数据库配置
    * @throws DbException
    * @return resource
    */
    public function connect($config)
    {
        if ($this->_dbLink = sqlite_open($config->file, 0666, $error)) {
            return $this->_dbLink;
        }
        
        throw new DbException($error);
    }
    
    /**
    * 执行数据库查询
    * @param string $query 数据库查询sql字符串
    * @param mixed $handle 连接对象
    * @return resource
    */
    public function query($query, $handle)
    {
        if ($resource = @sqlite_query($query, $handle)) {
            return $resource;
        }
    }
}

  

定义一个工厂类,根据传入不同的参数生成需要的类:

<?PHP
    class sqlFactory
    {
        public static function factory($type)
        {
            if (include_once 'Drivers/' . $type . '.PHP') {
                $classname = 'DbAdapter' . $type;
                return new $classname;
            } else {
                throw new Exception('Driver not found');
            }
        }
    }

  

调用

$db = sqlFactory::factory('MysqL');
$db = sqlFactory::factory('sqlite');

  

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐