PHP 常用设计模式 是构建可维护、可扩展、可测试的现代 PHP 应用(如 Laravel、Symfony)的核心工具。它不是“语法技巧”,而是解决软件设计问题的“标准化方案”。
一、知识体系总览
模块核心内容1. 设计模式分类创建型、结构型、行为型2. 创建型模式单例、工厂、抽象工厂、建造者、原型3. 结构型模式适配器、装饰器、代理、外观、组合、桥接、享元4. 行为型模式观察者、策略、命令、模板方法、状态、责任链、迭代器、中介者、备忘录、访问者、解释器5. 底层原理:SOLID 原则、依赖注入、组合优于继承6. 与框架的关系Laravel、Symfony 中的设计模式应用7. PHP 特性支持__construct、__clone、interface、trait8. 故障排查循环依赖、性能问题、过度设计9. 最佳实践何时使用、何时避免10. 源码级解析Laravel 核心组件中的模式11. 与设计原则的关系SOLID、DRY、KISS12. 反模式(Anti-Patterns)全局变量、上帝对象13. 自动化测试与模式Mock、Stub14. 未来趋势函数式编程、CQRS、Event Sourcing
二、设计模式三大分类
✅ 1. 创建型模式(Creational)
目标:控制对象的创建过程解决:何时创建?如何创建?创建哪个?
模式用途单例(Singleton)确保全局只有一个实例(如数据库连接)工厂方法(Factory Method)由子类决定创建哪个对象抽象工厂(Abstract Factory)创建一组相关对象(如 UI 主题)建造者(Builder)分步构建复杂对象(如 SQL 查询)原型(Prototype)通过克隆创建对象(PHP 中少用)
✅ 2. 结构型模式(Structural)
目标:组合类或对象,形成更大结构解决:如何组合?如何解耦?
模式用途适配器(Adapter)让不兼容接口协同工作(如旧 API 包装)装饰器(Decorator)动态添加功能(如日志、缓存)代理(Proxy)控制对象访问(如延迟加载、权限检查)外观(Facade)为复杂子系统提供简单接口(如 Laravel 的 Cache 门面)组合(Composite)树形结构(如文件系统)桥接(Bridge)分离抽象与实现(如数据库驱动)享元(Flyweight)共享对象,节省内存(如字符对象池)
✅ 3. 行为型模式(Behavioral)
目标:对象间通信与职责分配解决:如何通信?谁负责?如何扩展行为?
模式用途观察者(Observer)事件系统(如 Laravel 事件)策略(Strategy)封装算法族,可互换(如支付方式)命令(Command)将请求封装为对象(如任务队列)模板方法(Template Method)定义算法骨架,子类实现细节状态(State)对象行为随状态改变(如订单状态机)责任链(Chain of Responsibility)请求链式处理(如中间件)迭代器(Iterator)统一遍历接口(PHP 内置 Iterator 接口)中介者(Mediator)减少对象间直接依赖(如聊天室)备忘录(Memento)对象状态快照(如撤销操作)访问者(Visitor)在不修改类的情况下添加新操作解释器(Interpreter)语言解析(如正则表达式)
三、底层原理:为什么需要设计模式?
✅ 1. SOLID 原则(设计模式的基础)
原则说明对应模式S 单一职责一个类只做一件事所有模式O 开闭原则对扩展开放,对修改关闭策略、装饰器、工厂L 里氏替换子类可替换父类多态I 接口隔离客户端只依赖所需接口适配器、外观D 依赖倒置依赖抽象,不依赖具体工厂、DI
✅ 2. 组合优于继承
继承:静态、脆弱、多层继承难维护组合:动态、灵活、易于测试装饰器、策略、命令 都是组合的体现
✅ 3. 依赖注入(DI)与控制反转(IoC)
设计模式的“催化剂”Laravel 的 Service Container 让模式更易实现例如:策略模式通过 DI 注入不同策略
四、PHP 特性如何支持设计模式?
PHP 特性支持的模式interface策略、工厂、适配器(定义契约)trait装饰器、组合(复用代码)__construct()依赖注入、工厂__clone()原型模式__call() / __get()代理、装饰器Closure命令、策略(闭包作为行为)Generator迭代器
五、经典案例:Laravel 中的设计模式
模式Laravel 实现单例App::singleton()工厂Log::channel() 返回不同驱动外观(Facade)Cache::get()、Mail::send()观察者Event::listen()、dispatch(new OrderShipped)策略缓存驱动(file, redis, memcached)代理Eloquent 模型的访问器/修改器装饰器中间件(auth, throttle)命令Artisan 命令、队列任务模板方法Controller 基类责任链HTTP 中间件链
六、最佳实践
✅ 推荐做法
理解问题再选模式,不要“为了模式而模式”优先使用组合和 DI用接口定义契约避免过度使用单例(难测试、全局状态)在框架中学习模式(Laravel 源码是宝库)
❌ 避免
实现所有 23 种模式在简单场景用复杂模式忽视性能(如过度代理)不写测试
七、故障排查
问题原因解决方案循环依赖A 依赖 B,B 依赖 A用 setter 注入或事件解耦性能下降多层装饰器/代理缓存或扁平化难以测试全局单例用 DI 容器替换代码臃肿过度设计回归 KISS 原则
八、总结
PHP 常用设计模式的本质
一套解决软件设计问题的“标准化工具箱”——它用接口、组合、DI 实现高内聚、低耦合,让代码更易维护、扩展和测试
核心原理
SOLID 原则:设计模式的理论基础组合优于继承:模式的核心思想依赖注入:模式的实现支柱接口隔离:解耦的关键框架集成:Laravel/Symfony 是最佳实践
成功关键
✅ 理解三大分类
✅ 掌握单例、工厂、策略、观察者、装饰器
✅ 在 Laravel 中学习模式应用
✅ 用接口和 DI 替代继承
✅ 避免过度设计
一句话总结:
设计模式不是“魔法咒语”,而是“工程图纸”——你用单例控制资源,用策略切换算法,用观察者解耦事件,用装饰器叠加功能,构建真正的企业级应用。
掌握它,你就能从“写代码的人”变成“设计系统的人”。