PHP 工厂设计模式:从概念到实践的完整指南
在 PHP 开发中,设计模式是提升代码可维护性与扩展性的重要工具,而工厂模式作为创建型设计模式的代表,被广泛应用于对象创建的场景中。本文将深入解析工厂设计模式的核心思想、应用场景,并通过实例展示其在 PHP 项目中的具体实现。
工厂设计模式(Factory Pattern)是一种通过工厂类统一管理对象创建过程的设计模式。它的核心思想是将对象的创建逻辑与使用逻辑分离,由专门的工厂类负责对象实例化,客户端只需调用工厂方法即可获取所需对象,无需关心具体的创建细节。
这种模式的优势在于:
- 降低耦合度:客户端无需依赖具体类,只需与工厂接口交互;
- 简化维护:对象创建逻辑集中在工厂类,修改时只需调整工厂代码;
- 便于扩展:新增产品类时,只需扩展工厂类即可,无需修改客户端代码。
根据复杂度和适用场景,工厂模式可分为三类:
这是最基础的实现方式,通过一个工厂类的静态方法根据参数创建不同对象。它不属于 GoF 23 种设计模式,但因实现简单被广泛使用。
定义一个创建对象的接口,让子类决定实例化哪个类。工厂方法将对象创建延迟到子类,更符合 “开放 - 封闭原则”。
提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定具体类。适用于存在多个产品族的复杂场景。
假设我们需要开发一个支付系统,支持支付宝、微信支付两种方式。每种支付方式包含 “创建订单” 和 “发起支付” 两个方法,我们将通过工厂模式实现这一需求。
步骤 1:定义支付接口
interface PaymentInterface {
public function createOrder(float $amount): string;
public function pay(string $orderId): bool;
}
步骤 2:实现具体支付类
// 支付宝支付
class Alipay implements PaymentInterface {
public function createOrder(float $amount): string {
return "支付宝订单:" . uniqid();
}
public function pay(string $orderId): bool {
echo "支付宝支付订单 {$orderId} 成功\n";
return true;
}
}
// 微信支付
class WechatPay implements PaymentInterface {
public function createOrder(float $amount): string {
return "微信订单:" . uniqid();
}
public function pay(string $orderId): bool {
echo "微信支付订单 {$orderId} 成功\n";
return true;
}
}
步骤 3:创建简单工厂类
class PaymentFactory {
// 静态工厂方法,根据类型创建对应支付对象
public static function createPayment(string $type): PaymentInterface {
switch ($type) {
case 'alipay':
return new Alipay();
case 'wechat':
return new WechatPay();
default:
throw new InvalidArgumentException("不支持的支付方式:{$type}");
}
}
}
步骤 4:客户端调用
// 获取支付宝支付对象
$alipay = PaymentFactory::createPayment('alipay');
$orderId = $alipay->createOrder(99.9);
$alipay->pay($orderId);
// 获取微信支付对象
$wechatPay = PaymentFactory::createPayment('wechat');
$orderId2 = $wechatPay->createOrder(199.9);
$wechatPay->pay($orderId2);
当支付方式需要个性化配置(如不同商户号)时,简单工厂可能变得臃肿,此时工厂方法模式更合适:
步骤 1:定义工厂接口
interface PaymentFactoryInterface {
public function createPayment(): PaymentInterface;
}
步骤 2:实现具体工厂类
class AlipayFactory implements PaymentFactoryInterface {
private $appId;
private $privateKey;
public function __construct(string $appId, string $privateKey) {
$this->appId = $appId;
$this->privateKey = $privateKey;
}
public function createPayment(): PaymentInterface {
// 初始化支付宝配置
return new Alipay($this->appId, $this->privateKey);
}
}
class WechatPayFactory implements PaymentFactoryInterface {
private $mchId;
private $apiKey;
public function __construct(string $mchId, string $apiKey) {
$this->mchId = $mchId;
$this->apiKey = $apiKey;
}
public function createPayment(): PaymentInterface {
// 初始化微信支付配置
return new WechatPay($this->mchId, $this->apiKey);
}
}
步骤 3:客户端调用
// 支付宝工厂(带配置)
$alipayFactory = new AlipayFactory('2021000000000000', '私钥内容');
$alipay = $alipayFactory->createPayment();
// 微信支付工厂(带配置)
$wechatFactory = new WechatPayFactory('1600000000', 'API密钥');
$wechatPay = $wechatFactory->createPayment();
- 对象创建复杂:当对象初始化需要大量参数或依赖时,工厂模式可简化客户端代码;
- 需要统一管理对象创建:如数据库连接池、日志实例等全局资源;
- 存在多个相似产品:如支付方式、消息推送渠道等,便于横向扩展;
- 希望隐藏具体实现:客户端只需知道接口,无需关心具体类。
工厂设计模式通过封装对象创建逻辑,有效提升了代码的灵活性和可维护性。在 PHP 开发中,简单工厂适合快速实现,工厂方法更适合需要个性化配置的场景,而抽象工厂则适用于多产品族的复杂系统。
实际开发中,不必严格遵循模式定义,应根据项目规模选择合适的实现方式。合理使用工厂模式,能让你的代码在面对需求变更时更具韧性。
发布时间 : 2025-09-07,阅读量:31
, 分类:
PHP
本文链接:
https://upwqy.com/index.php/details/995.html