[TOC] #### 1. 工厂模式介绍 --- 工厂模式是 PHP 开发中最常用的设计模式之一,属于创建型设计模式(用一个工厂类统一负责对象创建) 它的核心思想是:将对象的创建和使用分离,通过一个 “工厂类” 来负责实例化对象,而不是在代码中直接 `new` 对象 在 PHP 中,工厂模式主要分为三种:简单工厂模式、工厂方法模式和抽象工厂模式 简单工厂模式(最常用): + 核心特点:一个工厂搞定所有,靠参数判断;产品种类少,逻辑简单 + 优缺点:结构简单,调用方便;但是违反开闭原则,扩展麻烦 + 使用场景:产品种类少,逻辑简单 工厂方法模式: + 核心特点:一个产品对应一个工厂 + 优缺点:符合开闭原则,扩展性强;但是类数量成倍增加,系统复杂 + 使用场景:产品种类多,需要频繁扩展 抽象工厂模式: + 核心特点:一个工厂生产一族产品 + 优缺点:隔离具体类,保证产品族一致性;扩展新产品族非常困难 + 使用场景:需要创建相关联的对象族 实际应用场景:在 PHP 的实际开发中,工厂模式应用非常广泛 + 数据库连接:根据配置文件,工厂返回不同的数据库连接对象 + 日志系统:根据配置,工厂返回文件日志、数据库日志或远程服务器日志对象 + 支付网关:根据用户选择的支付方式,工厂返回对应的支付处理对象 + 框架底层:Laravel 等框架的 Service Container(服务容器)在某种程度上就是高级的工厂模式实现 虽然工厂模式很好用,但也要注意(避坑指南): + 命令规范:工厂方法通常以 create、make、build 开头,清晰表达意图 + 不要过度设计:如果一个类很简单,直接 new 就可以了,强行使用工厂模式会增加代码复杂度 #### 2. 简单工厂模式 --- 这是最基础的形式。一个工厂类根据传入的参数(如:字符串),决定创建出哪一种产品类的实例 + 特点:工厂类通常是静态方法,逻辑集中 + 缺点:违反 “开闭原则”。如果要增加新产品,必须修改工厂类的逻辑(switch 语句) ```php // 1. 定义产品接口 interface Sms { public function send(); } // 2. 具体产品类 class Aliyun implements Sms { public function send() { echo "发送 aliyun 短信验证码"; } } class Tencent implements Sms { public function send() { echo "发送 tencent 短信验证码"; } } // 3. 简单工厂类 class SmsFactory { public static function create(string $type) { switch ($type) { case 'aliyun': return new Aliyun(); break; case 'tencent': return new Tencent(); break; default: throw new \Exception("Unknown type"); break; } } } // 4. 客户端调用 $factory = SmsFactory::create('aliyun'); $factory->send(); ``` #### 3. 工厂方法模式 --- 为了解决简单工厂违反 “开闭原则” 的问题,工厂方法模式定义了一个创建对象的接口,让子类决定实例化哪一个类 + 特点:每个产品都有一个对应的工厂类 + 优点:完全符合 “开闭原则”。增加新产品时,只需增加对应的产品类和工厂类,无需修改旧代码 ```php // 1. 定义产品接口 interface SmsInterface { public function send(); } // 2. 具体产品类 class Aliyun implements SmsInterface { public function send() { echo "发送 aliyun 短信验证码"; } } class Tencent implements SmsInterface { public function send() { echo "发送 tencent 短信验证码"; } } // 3. 定义工厂接口 interface FactoryInterface { public function create(); } // 4. 具体工厂类 class AliyunFactory implements FactoryInterface { public function create() { return new Aliyun(); } } class TencentFactory implements FactoryInterface { public function create() { return new Tencent(); } } // 5. 客户端调用 $instance = (new TencentFactory)->create(); $instance->send(); ``` #### 4. 抽象工厂模式 --- 这是工厂模式中抽象程度最高的一种。它用于创建一族相关或相互依赖的对象(产品族),而不只是单一产品。 场景:比如,我们要组装一台电脑需要 CPU、主板、内存。Intel 工厂生产的 Intel CPU 和 Intel 主板,AMD 工厂生产 AMD CPU 和 AMD 主板,我们需要保证这些配件是兼容的。 特点:一个工厂能生产多种产品,但这些产品属于同一个系列 ```php // 1. 定义产品接口 interface Cpu {} interface Motherboard {} // 2. 具体产品 class IntelCpu implements Cpu {} class IntelMb implements Motherboard {} class AmdCpu implements Cpu {} class AmdMb implements Motherboard {} // 3. 抽象工厂接口 interface ComputerFactory { public function createCpu(); public function createMotherboard(); } // 4. 具体工厂 class IntelFactory implements ComputerFactory { public function createCpu() { return new IntelCpu(); } public function createMotherboard() { return new IntelMb(); } } class AmdFactory implements ComputerFactory { public function createCpu() { return new AmdCpu(); } public function createMotherboard() { return new AmdMb(); } } // 5. 客户端调用 $factory = new IntelFactory(); $cpu = $factory->createCpu(); // 得到 Intel CPU $mb = $factory->createMotherboard(); // 得到 Intel 主板 ```