当前位置: 首页 > news >正文

简单工厂、工厂方法、抽象工厂的PHP代码区别?

这三个模式名字很像,但解决的问题层级代码结构完全不同。

  • 简单工厂 (Simple Factory):一个类包办所有创建逻辑(违反开闭原则)。
  • 工厂方法 (Factory Method):每个产品对应一个工厂子类(针对一个产品等级)。
  • 抽象工厂 (Abstract Factory):每个系列对应一个工厂类,能生产一族相关产品(针对多个产品等级)。

以下是用 PHP 代码进行的直观对比。


1. 简单工厂 (Simple Factory)

核心特征静态方法 + Switch/If-else
缺点:每增加一个新产品,必须修改工厂类的代码(违反开闭原则 OCP)。

// --- 产品接口 ---interfaceCar{publicfunctiondrive():string;}classBenzimplementsCar{publicfunctiondrive():string{return"Driving Benz";}}classBmwimplementsCar{publicfunctiondrive():string{return"Driving Bmw";}}// --- 简单工厂 (God Class) ---classSimpleCarFactory{// 缺点:每次加新车,都要改这里的 switchpublicstaticfunctioncreate(string$type):Car{if($type==='benz'){returnnewBenz();}elseif($type==='bmw'){returnnewBmw();}thrownewException("Invalid car type");}}// --- 调用 ---$car=SimpleCarFactory::create('benz');echo$car->drive();

2. 工厂方法 (Factory Method)

核心特征定义工厂接口,让子类决定实例化哪个类
适用:只有一个产品维度(比如只造车,不造轮胎)。
优点:新增产品只需新增一个工厂类,无需修改旧代码(符合 OCP)。

// --- 产品接口 (同上) ---// interface Car { ... }// class Benz implements Car { ... }// class Bmw implements Car { ... }// --- 工厂接口 ---interfaceCarFactory{publicfunctionproduce():Car;}// --- 具体工厂:每个工厂只负责一种车 ---classBenzFactoryimplementsCarFactory{publicfunctionproduce():Car{returnnewBenz();}}classBmwFactoryimplementsCarFactory{publicfunctionproduce():Car{returnnewBmw();}}// --- 调用 ---$factory=newBenzFactory();// 想换车?换个工厂对象即可$car=$factory->produce();echo$car->drive();

3. 抽象工厂 (Abstract Factory)

核心特征针对“产品族”。一个工厂能生产一系列相关产品(如:宝马车 + 宝马轮胎 + 宝马引擎)。
适用:有多个产品维度,且需要保证它们属于同一个系列(不能混用)。

// --- 产品族 A:车 ---interfaceCar{publicfunctiondrive():string;}classBenzCarimplementsCar{publicfunctiondrive():string{return"Benz Car";}}classBmwCarimplementsCar{publicfunctiondrive():string{return"Bmw Car";}}// --- 产品族 B:轮胎 (新增维度) ---interfaceTire{publicfunctionroll():string;}classBenzTireimplementsTire{publicfunctionroll():string{return"Benz Tire";}}classBmwTireimplementsTire{publicfunctionroll():string{return"Bmw Tire";}}// --- 抽象工厂接口:定义能生产一族产品 ---interfaceVehicleFactory{publicfunctioncreateCar():Car;publicfunctioncreateTire():Tire;// 注意:能产多种东西}// --- 具体工厂:代表一个完整的品牌系列 ---classBenzFactoryimplementsVehicleFactory{publicfunctioncreateCar():Car{returnnewBenzCar();}publicfunctioncreateTire():Tire{returnnewBenzTire();}}classBmwFactoryimplementsVehicleFactory{publicfunctioncreateCar():Car{returnnewBmwCar();}publicfunctioncreateTire():Tire{returnnewBmwTire();}}// --- 调用 ---$factory=newBmwFactory();// 选定一个系列(宝马系)$car=$factory->createCar();// 产出宝马车$tire=$factory->createTire();// 产出宝马轮胎// 保证了一致性:不会出现“宝马车 + 奔驰轮胎”的尴尬组合echo$car->drive()." with ".$tire->roll();

🚀 三者核心区别对比表

特性简单工厂工厂方法抽象工厂
核心结构1 个工厂类 +if/switch1 个工厂接口 + N 个工厂子类1 个工厂接口 (含多个方法) + N 个工厂子类
扩展新产品修改现有工厂代码 (违反 OCP)新增一个工厂类 (符合 OCP)新增一个工厂类 (符合 OCP)
扩展新产品族不适用不适用 (只能扩单品)新增一组具体产品类 + 修改工厂接口 (违反 OCP)
关注点怎么创建(集中管理)创建哪一个(单一产品)创建哪一族(配套产品)
代码量最少中等 (类多)最多 (接口多、类多)
PHP 场景小型脚本、快速原型支付网关、日志驱动 (单维度)云服务商 SDK (AWS vs Aliyun)、UI 主题 (Win vs Mac)

💡 一句话总结选择策略

  1. 如果只有一两种产品,且以后不太会变 ->简单工厂(甚至直接new)。
  2. 如果产品会经常增加,但只是单一类型的变化 (如只增加新的支付方式) ->工厂方法
  3. 如果产品是成套出现的,且需要严格保证系列一致性(如换了数据库驱动,缓存驱动也要跟着换) ->抽象工厂

在现代 PHP 框架(如 Laravel)中,依赖注入容器 (DI Container)实际上接管了这些工厂模式的职责,你通常只需要配置绑定关系,而不需要手写这么多工厂类。但理解它们的区别有助于你设计解耦的架构。

http://www.jsqmd.com/news/587730/

相关文章:

  • LLM 怎么生成回答?揭秘“思考“过程
  • Phi-4-mini-reasoning作品集:离散数学归纳法严谨性验证生成案例
  • OpenClaw人人养虾:后台执行
  • MySQL函数及条件查询相关用法
  • 2025_NIPS_Fast Monte Carlo Tree Diffusion: 100× Speedup via Parallel Sparse Planning
  • AI赋能论文研究:调用快马平台模型智能分析文本与提取关键词
  • OpenClaw多终端控制:千问3.5-9B实现跨设备协同
  • DREAM3D:革新材料科学数据处理的开源框架
  • Git 仓库搬家后,如何让本地仓库“认新家”?——小白也能看懂的远程地址修改指南
  • 效率提升:用快马AI快速生成带存储功能的EndNote工具
  • GHelper:华硕笔记本的终极开源性能控制解决方案
  • Redis怎样动态添加新的哨兵节点_直接启动新Sentinel并让其通过主库自动发现其他哨兵
  • 代码随想录—day2—滑动窗口与前缀和
  • ABAP 选择屏幕中创建多个自定义按钮
  • 技术深析:衡石Agentic BI的架构革命与核心技术突破
  • openLCA完整安装与使用终极指南:免费开源的生命周期评估解决方案
  • 适配新的gps模块,在Android系统中注意哪些问题
  • AI赋能性能优化:让快马平台的智能模型帮你重构高性能代码
  • insightface进行视频中人脸识别
  • 【花雕学编程】行空板 K10 部署 MimiClaw 嵌入式 AI Agent 全指南(适配逻辑+命令全集+测试实践)
  • 2025苏州GEO大模型AI优化服务白皮书
  • 零基础看懂计算机视觉:让机器像人一样“看见”世界,原来原理这么简单
  • PvZ Toolkit:3步解锁植物大战僵尸终极游戏增强工具,打造完全自定义体验
  • SEO_本地中小企业快速见效的SEO推广技巧
  • 【PCIe验证每日学习·Day25】PCIe 电源管理机制(L0s/L1/L2/L3)全解析
  • AI 究竟让年轻人更有优势,还是更难立足?
  • 企业网站SEO优化需要做哪些内容优化_如何进行企业网站的SEO优化
  • DeepSeek可以解决什么问题?
  • 告别手动配置:用快马ai脚本实现openclaw一键式高效部署
  • 探索Wand-Enhancer:开源工具实现WeMod功能解锁与安全实践指南