PHP怎么实现工厂模式_Factory模式编写指南【指南】

用静态方法封装对象创建逻辑,返回统一接口类型,避免散落的new、解耦调用方与具体类,适用于构造依赖外部配置或需统一初始化的场景。PHP里怎么写一个能用的工厂类直接给结论:用静态方法封装对象创建逻辑,别让调用方关心具体类名和构造细节。核心不是"设计模式"这个词,而是解决「new 太多、类型分散、改起来牵一发而动全身」的问题。常见错误现象:new User()、new Admin()、new Guest() 在控制器里到处出现;加个新角色就得翻遍所有 new 地方;单元测试时没法轻松替换成 Mock 对象。工厂类本身不继承任何东西,也不实现接口------它只是个纯工具类返回类型统一用接口或抽象类(比如 UserInterface),而不是具体类名避免在工厂里做复杂业务判断,比如「根据 IP 地址决定返回哪个用户」------那是策略模式的事,工厂只管"造出来",不管"为什么造"如果参数差异大(比如有的要传 id,有的要传 token),优先拆成多个静态方法,比如 createFromId() 和 createFromToken(),别硬塞进一个 create()什么时候该用工厂,而不是 new 或 DI 容器不是所有对象创建都适合工厂。关键看「创建逻辑是否稳定」和「调用方是否需要解耦」。使用场景:立即学习"PHP免费学习笔记(深入)";对象构造依赖外部配置(比如不同环境用不同缓存驱动,但代码里不能写死 new RedisCache())类名可能变化(比如从 JsonLogger 换成 SentryLogger,但日志接口不变)需要统一初始化行为(比如每个 Connection 实例都必须调用 connect())别用工厂的情况:对象很简单,没依赖、没配置、没状态(比如 new DateTime())项目已用 DI 容器(如 Laravel 的 app()->make() 或 Symfony 的 container-\>get()),再写一层工厂纯属重复劳动工厂方法里开始做 if-else 类型路由(比如 if (type === 'mysql') { return new MysqlAdapter(); })------这其实是简单工厂的退化,该上抽象工厂或策略了静态工厂 vs 抽象工厂:PHP 里怎么选PHP 没有接口方法的重载,也没办法像 Java 那样靠泛型约束类型,所以「抽象工厂」在 PHP 里容易写得笨重又难测。大多数时候,静态工厂够用,且更直觉。 Fotor AI Image Generator Fotor 平台的 AI 图片生成器

相关推荐
大数据魔法师2 小时前
Streamlit(三)- Streamlit 多页面应用开发
python·web
我的xiaodoujiao3 小时前
API 接口自动化测试详细图文教程学习系列20--结合Pytest框架使用
python·学习·测试工具·pytest
Dicky-_-zhang3 小时前
日志管理实战:ELK与Loki对比选型与落地实践
java·jvm
python在学ing3 小时前
前端-CSS学习笔记
前端·css·python·学习
小王C语言3 小时前
【线程概念与控制】:线程封装
jvm·c++·算法
用户434309241693 小时前
Day29:图片上传 + 存数据库(Multer + MySQL)
数据库·后端
lolo大魔王3 小时前
MongoDB 索引机制详解:单字段索引、复合索引、唯一索引与性能优化
数据库·mongodb
newnazi4 小时前
RedHat10 安装MS SQL Server2025
linux·服务器·数据库
KaMeidebaby4 小时前
卡梅德生物技术快报|单 B 细胞抗体制备:流程优化、表达系统适配与性能数据
前端·数据库·其他·百度·新浪微博