工厂模式通过工厂类统一创建对象,解决多数据源下对象生成的耦合问题。在PHP中,定义UserDataInterface接口并由MySQL、Redis、API等类实现,UserDataFactory工厂类根据类型返回对应实例,业务代码只需调用create方法获取对象,无需关心具体实现,新增数据源时仅扩展工厂即可,提升可维护性与扩展性。

工厂模式是一种创建型设计模式,适用于需要根据不同的条件创建不同对象的场景。在PHP开发中,当处理多种数据来源(如MySQL、Redis、API接口等)时,使用工厂模式可以让代码更灵活、可维护性更高。
什么是工厂模式
工厂模式通过一个专门的“工厂”类来负责创建对象,而不是在代码中直接 new 一个具体类。这样做的好处是:将对象的创建与使用分离,降低耦合度,方便后续扩展和维护。
比如你有一个需求:从不同的数据源读取用户数据——可能是数据库、缓存或远程API。如果不使用工厂模式,代码可能到处都是判断逻辑和 new 操作,难以管理。
使用场景举例
假设你的系统支持以下几种数据源:
立即学习“PHP免费学习笔记(深入)”;
- MySQL 数据库
- Redis 缓存
- 远程 HTTP API
你想统一获取用户数据的方式,但底层实现可以切换。
定义数据接口
首先定义一个统一的接口,所有数据源都实现这个接口:
interface UserDataInterface {
public function getUser($id);
}
这个接口规定了所有数据源必须提供 getUser 方法。
使用模板与程序分离的方式构建,依靠专门设计的数据库操作类实现数据库存取,具有专有错误处理模块,通过 Email 实时报告数据库错误,除具有满足购物需要的全部功能外,成新商城购物系统还对购物系统体系做了丰富的扩展,全新设计的搜索功能,自定义成新商城购物系统代码功能代码已经全面优化,杜绝SQL注入漏洞前台测试用户名:admin密码:admin888后台管理员名:admin密码:admin888
实现具体数据类
接下来编写各个数据源的具体实现:
class MysqlUserData implements UserDataInterface {
public function getUser($id) {
// 模拟从 MySQL 查询
return ['id' => $id, 'name' => '用户来自MySQL', 'type' => 'mysql'];
}
}
class RedisUserData implements UserDataInterface {
public function getUser($id) {
// 模拟从 Redis 获取
return ['id' => $id, 'name' => '用户来自Redis', 'type' => 'redis'];
}
}
class ApiUserData implements UserDataInterface {
public function getUser($id) {
// 模拟调用远程 API
return ['id' => $id, 'name' => '用户来自API', 'type' => 'api'];
}
}
创建工厂类
现在创建一个工厂类,根据传入的类型返回对应的数据对象:
class UserDataFactory {
public static function create($type) {
switch ($type) {
case 'mysql':
return new MysqlUserData();
case 'redis':
return new RedisUserData();
case 'api':
return new ApiUserData();
default:
throw new InvalidArgumentException("不支持的数据源类型: " . $type);
}
}
}
工厂类使用静态方法 create,接收一个字符串参数决定实例化哪个类。
在业务中使用工厂
实际调用时非常简洁:
// 根据配置或请求参数选择数据源
$source = $_GET['source'] ?? 'mysql'; // 可为 mysql, redis, api
try {
$userData = UserDataFactory::create($source);
$user = $userData->getUser(123);
echo json_encode($user);
} catch (Exception $e) {
echo "错误: " . $e->getMessage();
}
此时如果要新增一种数据源(比如MongoDB),只需要新增一个类并修改工厂,其他调用代码无需改动。
优点总结
- 解耦创建逻辑:业务代码不关心具体类名,只依赖接口
- 易于扩展:增加新数据源只需添加类和修改工厂
- 集中管理对象创建:便于统一处理初始化参数、日志、异常等
进阶建议
基本上就这些。工厂模式在PHP数据操作中很实用,尤其适合多数据源、多策略的项目结构。合理使用能让系统更清晰、更易维护。










