php设计模式总结

设计模式是面向对象编程中解决特定场景问题的成熟方案,在 PHP 开发中,常用设计模式可按核心解决问题分为三大类,以下是系统化的分类梳理、核心思想及优缺点分析。

一、设计模式整体分类

|---------|--------------------------------------------|--------------------|
| 分类 | 核心目标 | 典型适用场景 |
| 创建型设计模式 | 优化对象创建过程,解耦 "对象创建" 与 "对象使用" 逻辑,提升对象实例化的灵活性 | 对象实例化、复杂对象构建、资源复用等 |
| 结构型设计模式 | 优化类 / 对象的组合关系,通过合理的结构设计提升代码复用性与扩展能力 | 接口适配、功能扩展、对象代理等 |
| 行为型设计模式 | 规范类 / 对象间的交互方式与职责分配,优化通信逻辑,提升代码可维护性 | 算法封装、事件通知、请求处理等 |

二、各分类核心设计模式详解

(一)创建型设计模式

1.1 单例模式(Singleton)
  • 核心思想
    • 保证一个类在应用生命周期内仅存在一个实例,并提供全局统一的访问入口。
  • 优点
  1. 减少内存占用,避免重复创建重量级对象(如数据库连接、配置类);
  2. 全局统一访问点,便于集中控制对象状态。
  • 缺点
  1. 违背 "单一职责原则",类既承担业务逻辑,又负责实例管控;
  2. 全局状态依赖导致单元测试难以模拟,降低测试灵活性;
  3. 多进程 / 多线程场景下需额外处理并发问题(PHP CLI 多进程无此问题,FPM 环境需注意)。
1.2 工厂模式(Factory)
  • 核心思想
    • 封装对象创建逻辑,通过工厂类统一生成不同类型的对象,分为简单工厂、工厂方法、抽象工厂三种实现形式。
  • 优点
  1. 解耦对象创建与使用,修改创建规则仅需调整工厂类;
  2. 工厂方法 / 抽象工厂符合 "开闭原则",新增产品无需修改原有代码;
  3. 便于统一管理对象初始化(如统一注入依赖、设置参数)。
  • 缺点
  1. 简单工厂违背 "开闭原则",新增产品需修改工厂类的判断逻辑;
  2. 抽象工厂会导致类数量大幅增加,提升系统复杂度。
1.3 建造者模式(Builder)
  • 核心思想
    • 将复杂对象的构建过程与最终表示分离,通过分步构建的方式灵活控制对象创建流程。
  • 优点
  1. 支持分步构建复杂对象,适配不同配置需求(如多维度的订单对象);
  2. 解耦构建逻辑与产品结构,相同构建流程可复用至不同产品。
  • 缺点
  1. 结构复杂,需额外定义建造者、导演类等,增加代码量;
  2. 仅适用于 "构建步骤固定、对象结构复杂" 的场景,简单对象使用会过度设计。

(二)结构型设计模式

2.1 适配器模式(Adapter)
  • 核心思想
    • 将现有类的接口转换为客户端期望的接口形式,解决接口不兼容导致的复用问题。
  • 优点
  1. 复用现有类(如第三方 SDK),无需修改原有代码即可适配新场景;
  2. 降低代码耦合,隔离接口差异带来的影响;
  3. 符合 "开闭原则",新增适配器不影响原有业务逻辑。
  • 缺点
  1. 新增适配器类会增加代码量,提升系统层级;
  2. 适配复杂接口时,适配器的转换逻辑会变得繁琐,易出错。
2.2 装饰器模式(Decorator)
  • 核心思想
    • 动态为对象添加额外职责,替代继承的灵活扩展方案,支持多职责叠加。
  • 优点
  1. 无需修改原有类即可扩展功能,符合 "开闭原则";
  2. 支持多个装饰器组合使用,实现功能叠加(如订单叠加优惠券、运费、满减规则);
  3. 比继承更灵活,可按需动态添加 / 移除职责。
  • 缺点
  1. 多层装饰会导致类数量激增,增加调试与维护难度;
  2. 装饰器的执行顺序会影响最终结果,需谨慎设计调用链路。
2.3 代理模式(Proxy)
  • 核心思想
    • 为目标对象提供一个代理对象,通过代理控制对目标对象的访问,可在访问前后添加额外逻辑。
  • 优点
  1. 解耦客户端与目标对象,可在访问前添加日志、缓存、权限校验等逻辑;
  2. 支持延迟加载,仅在真正需要时初始化目标对象(如大文件、远程服务对象)。
  • 缺点
  1. 新增代理类会提升系统复杂度;
  2. 代理层的额外逻辑会增加请求处理耗时,影响性能。

(三)行为型设计模式

3.1 观察者模式(Observer)
  • 核心思想
    • 定义对象间的 "一对多" 依赖关系,当被观察者状态变更时,所有依赖它的观察者会自动收到通知并更新。
  • 优点
  1. 解耦被观察者与观察者,新增观察者无需修改被观察者代码;
  2. 支持广播通知,适配 "一个事件触发多个处理逻辑" 的场景;
  3. 符合 "开闭原则",扩展灵活。
  • 缺点
  1. 观察者数量过多时,通知过程会产生性能损耗;
  2. 可能存在循环依赖,导致内存泄漏;
  3. 观察者的通知顺序不可控,易引发逻辑冲突。
3.2 策略模式(Strategy)
  • 核心思想
    • 将多个算法封装为独立的策略类,使算法可互相替换,且算法变化不影响客户端使用。
  • 优点
  1. 替代大量 if-else 判断,提升代码可读性(如不同支付方式、排序算法的切换);
  2. 算法与客户端解耦,便于单独维护和扩展;
  3. 符合 "开闭原则",新增算法仅需添加新策略类。
  • 缺点
  1. 客户端需了解所有策略类的差异,才能选择合适的策略;
  2. 策略类数量会随算法增多而增加,提升管理成本。
3.3 迭代器模式(Iterator)
  • 核心思想
    • 提供统一的接口遍历聚合对象的元素,无需暴露聚合对象的内部结构。
  • 优点
  1. 统一不同聚合对象(数组、自定义集合、数据库结果集)的遍历方式;
  2. 解耦遍历逻辑与聚合对象,便于扩展遍历方式(如正向、反向遍历)。
  • 缺点
  1. 简单遍历场景下(如普通数组)使用迭代器会增加复杂度(PHP 原生 foreach 已足够);
  2. 自定义迭代器需实现多个接口方法,开发成本较高。

三、PHP 常用设计模式补充

除上述核心模式外,PHP 开发中还会根据场景使用以下模式:

  • 创建型:原型模式(通过复制对象避免重复初始化,提升性能);
  • 结构型:组合模式(处理树形结构对象,如菜单、分类)、享元模式(复用细粒度对象,如数据库连接池、缓存池);
  • 行为型:命令模式(封装请求为对象,支持撤销 / 重做)、责任链模式(请求链式处理,如中间件、权限校验链)、模板方法模式(固定流程骨架,自定义核心步骤)。

四、核心总结

  1. 分类逻辑:创建型解决 "对象如何创建",结构型解决 "对象如何组合",行为型解决 "对象如何交互";
  2. 使用原则:设计模式并非 "万能方案",需结合业务场景选择(如单例适配全局唯一资源、适配器适配第三方接口),避免过度设计;
  3. 核心价值:所有设计模式的最终目标是提升代码的可复用性、可扩展性、可维护性,遵循 "开闭原则""单一职责" 等面向对象设计准则。
相关推荐
JaguarJack21 小时前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo21 小时前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack2 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理2 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1232 天前
matlab画图工具
开发语言·matlab
dustcell.2 天前
haproxy七层代理
java·开发语言·前端
norlan_jame2 天前
C-PHY与D-PHY差异
c语言·开发语言
多恩Stone3 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
QQ4022054963 天前
Python+django+vue3预制菜半成品配菜平台
开发语言·python·django
QQ5110082853 天前
python+springboot+django/flask的校园资料分享系统
spring boot·python·django·flask·node.js·php