PHP 工厂设计模式:从概念到实践的完整指南


在 PHP 开发中,设计模式是提升代码可维护性与扩展性的重要工具,而工厂模式作为创建型设计模式的代表,被广泛应用于对象创建的场景中。本文将深入解析工厂设计模式的核心思想、应用场景,并通过实例展示其在 PHP 项目中的具体实现。

一、什么是工厂设计模式?

工厂设计模式(Factory Pattern)是一种通过工厂类统一管理对象创建过程的设计模式。它的核心思想是将对象的创建逻辑与使用逻辑分离,由专门的工厂类负责对象实例化,客户端只需调用工厂方法即可获取所需对象,无需关心具体的创建细节。

 

这种模式的优势在于:

 

  • 降低耦合度:客户端无需依赖具体类,只需与工厂接口交互;
  • 简化维护:对象创建逻辑集中在工厂类,修改时只需调整工厂代码;
  • 便于扩展:新增产品类时,只需扩展工厂类即可,无需修改客户端代码。

二、工厂模式的三种类型

根据复杂度和适用场景,工厂模式可分为三类:

1. 简单工厂模式(Simple Factory)

这是最基础的实现方式,通过一个工厂类的静态方法根据参数创建不同对象。它不属于 GoF 23 种设计模式,但因实现简单被广泛使用。

2. 工厂方法模式(Factory Method)

定义一个创建对象的接口,让子类决定实例化哪个类。工厂方法将对象创建延迟到子类,更符合 “开放 - 封闭原则”。

3. 抽象工厂模式(Abstract Factory)

提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定具体类。适用于存在多个产品族的复杂场景。

三、PHP 工厂模式实战示例

场景说明

假设我们需要开发一个支付系统,支持支付宝、微信支付两种方式。每种支付方式包含 “创建订单” 和 “发起支付” 两个方法,我们将通过工厂模式实现这一需求。

1. 简单工厂模式实现

步骤 1:定义支付接口

 

php
 
 
 
 
 
interface PaymentInterface {
    public function createOrder(float $amount): string;
    public function pay(string $orderId): bool;
}
 

 

步骤 2:实现具体支付类

 

php
 
 
 
 
 
// 支付宝支付
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:创建简单工厂类

 

php
 
 
 
 
 
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:客户端调用

 

php
 
 
 
 
 
// 获取支付宝支付对象
$alipay = PaymentFactory::createPayment('alipay');
$orderId = $alipay->createOrder(99.9);
$alipay->pay($orderId);

// 获取微信支付对象
$wechatPay = PaymentFactory::createPayment('wechat');
$orderId2 = $wechatPay->createOrder(199.9);
$wechatPay->pay($orderId2);
 

2. 工厂方法模式实现

当支付方式需要个性化配置(如不同商户号)时,简单工厂可能变得臃肿,此时工厂方法模式更合适:

 

步骤 1:定义工厂接口

 

php
 
 
 
 
 
interface PaymentFactoryInterface {
    public function createPayment(): PaymentInterface;
}
 

 

步骤 2:实现具体工厂类

 

php
 
 
 
 
 
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:客户端调用

 

php
 
 
 
 
 
// 支付宝工厂(带配置)
$alipayFactory = new AlipayFactory('2021000000000000', '私钥内容');
$alipay = $alipayFactory->createPayment();

// 微信支付工厂(带配置)
$wechatFactory = new WechatPayFactory('1600000000', 'API密钥');
$wechatPay = $wechatFactory->createPayment();
 

四、工厂模式的适用场景

  1. 对象创建复杂:当对象初始化需要大量参数或依赖时,工厂模式可简化客户端代码;
  2. 需要统一管理对象创建:如数据库连接池、日志实例等全局资源;
  3. 存在多个相似产品:如支付方式、消息推送渠道等,便于横向扩展;
  4. 希望隐藏具体实现:客户端只需知道接口,无需关心具体类。

五、总结

工厂设计模式通过封装对象创建逻辑,有效提升了代码的灵活性和可维护性。在 PHP 开发中,简单工厂适合快速实现,工厂方法更适合需要个性化配置的场景,而抽象工厂则适用于多产品族的复杂系统。

 

实际开发中,不必严格遵循模式定义,应根据项目规模选择合适的实现方式。合理使用工厂模式,能让你的代码在面对需求变更时更具韧性。
发布时间 : 2025-09-07,阅读量:1 , 分类: PHP
本文链接:https://upwqy.com/details/995.html
PHP 工厂方法模式:灵活创建对象的设计之道 PHP 数组创建全攻略:从入门到精通的 7 种实战技巧