PHP设计模式之工厂模式详解
这篇文章主要介绍了PHP设计模式之工厂模式详解,简单介绍了工厂模式的概念、原理并结合实例形式总结分析了工厂模式的具体定义及使用方法,需要的朋友参考下
工厂模式
工厂模式的优点就在创建对象上。建立一个工厂(即一个函数或一个类方法)来制造新的对象,它的任务就是把对象的创建过程都封装起来,
这样创建对象就不是使用new的形式了,而是定义一个方法,用于创建对象实例。
工厂模式增加代码的复用,减少代码耦合关系。通俗的说,以前创建一个对象要使用new,现在使用工厂模式就把这个过程封装起来了。
假设不使用工厂模式:那么很多地方调用类a,代码就会这样子创建一个实例:new a(),假设我们把a类的名称修改,意味着很多创建实例的代码都要修改。
数据库连接
很多地方会需要连接数据库,那么就将连接数据库的方法封装在一个类中,方便在其他类中通过类名调用。
关键:根据不同的参数生成不同的类实例,那么就符合工厂模式的设计思想。
工厂模式一个典型的应用就是:php可能要链接mysql,也可能要链接sqlserver,还有其他类型的数据库。
那么我们就做一个抽象的数据库类,这个类就是一个工厂类,专门负责产生不同的对象。
这样我们在连接数据库的时候,不是使用代码 new Mysql($host,$username,$password,$dbname) 的形式,
而是动态生成一个连接数据库的实例,是mysql,也能是连接oracle的。
class DbFactory
{
static function factory($db_class_name)
{
$db_class_name = strtolower($db_class_name);
if (include_once 'Drivers/' . $db_class_name . '.php') {
$classname = 'Driver_' . $db_class_name;
return new $db_class_name;
} else {
throw new Exception ('对应的数据库类没找到');
}
}
}
DbFactory::factory("mysql");
DbFactory::factory("oracle");
在thinkphp框架中也有对应的实现:
Db.class.php就是一个工厂类,也叫数据库中间层,能操作mysql、oracle等数据库。而这个类就是中间层作用,屏蔽掉具体数据库的实现。
让程序员不改动原来的查询代码。中间层来对接mysql、oracle等数据库。
Db.class.php中有个factory()
方法来创建不同的数据库实例
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;
}
支付接口的应用
对应不同的支付网关:支付宝、财付通、网银在线等,方便未来扩展,设计成工厂模式。
定一个专门生产网关接口的工厂,抽象出来,做成接口形式,让所有的子类都要实现它的接口。
以后加一个支付方式,要使用哪一种支付方式,改变一下参数即可。
以上就是本文PHP设计模式之工厂模式详解的全部内容,希望本文所述对大家PHP程序设计有所帮助。
相关推荐
深度学习 -- 损失函数
深度残差网络(Deep Residual Networks (ResNets))
深度学习 -- 激活函数
神经网络训练 -- 调整学习速率
生成对抗网络(GAN)改进与发展
生成对抗网络(GAN)优点与缺点
生成对抗网络(GAN)的训练
生成对抗网络(GAN)基本原理
生成模型与判别模型