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. 核心价值:所有设计模式的最终目标是提升代码的可复用性、可扩展性、可维护性,遵循 "开闭原则""单一职责" 等面向对象设计准则。
相关推荐
2301_788662402 小时前
C++中的代理模式高级应用
开发语言·c++·算法
嫂子开门我是_我哥2 小时前
第十七节:项目实战1:猜数字游戏(模块化开发实现)
开发语言·python·算法·游戏
啊阿狸不会拉杆2 小时前
《计算机操作系统》第十二章 - 保护和安全
开发语言·网络·c++·算法·安全·计算机组成原理·计算机操作系统
多米Domi0112 小时前
0x3f 第43天 黑马点评全量复习一遍 + 栈两题
开发语言·数据结构·python·算法·leetcode
码农水水3 小时前
京东Java面试被问:分布式会话的一致性和容灾方案
java·开发语言·数据库·分布式·mysql·面试·职场和发展
白小筠3 小时前
迭代器与生成器
开发语言·python
郝学胜-神的一滴3 小时前
Linux网络字节序详解:从理论到实践
linux·服务器·c语言·开发语言·c++·网络协议·程序人生
石像鬼₧魂石3 小时前
netsh wlan 常用命令速查表
服务器·网络·php
三七吃山漆3 小时前
[网鼎杯 2020 青龙组]AreUSerialz
php·反序列化·网鼎杯