PHP工廠模式如何實(shí)現(xiàn)依賴注入

PHP
小樊
81
2024-10-10 05:43:45

在PHP中,工廠模式是一種創(chuàng)建型設(shè)計(jì)模式,它提供了一種在不指定具體類的情況下創(chuàng)建對(duì)象的方法。依賴注入(Dependency Injection,DI)是一種實(shí)現(xiàn)控制反轉(zhuǎn)(Inversion of Control,IoC)的技術(shù),它允許我們將對(duì)象的依賴關(guān)系從對(duì)象內(nèi)部移動(dòng)到對(duì)象外部,從而使得代碼更加靈活和可測(cè)試。

下面是一個(gè)使用工廠模式和依賴注入的示例:

  1. 首先,我們定義一個(gè)接口 PaymentGateway,它表示支付網(wǎng)關(guān)。然后,我們創(chuàng)建兩個(gè)實(shí)現(xiàn)該接口的類:StripePaymentGatewayPaypalPaymentGateway。
interface PaymentGateway
{
    public function charge(float $amount);
}

class StripePaymentGateway implements PaymentGateway
{
    public function charge(float $amount)
    {
        // Stripe 支付邏輯
    }
}

class PaypalPaymentGateway implements PaymentGateway
{
    public function charge(float $amount)
    {
        // PayPal 支付邏輯
    }
}
  1. 接下來(lái),我們創(chuàng)建一個(gè)工廠類 PaymentGatewayFactory,它負(fù)責(zé)根據(jù)配置或請(qǐng)求參數(shù)創(chuàng)建適當(dāng)?shù)?PaymentGateway 實(shí)例。
class PaymentGatewayFactory
{
    public static function createPaymentGateway(string $gatewayType): PaymentGateway
    {
        switch ($gatewayType) {
            case 'stripe':
                return new StripePaymentGateway();
            case 'paypal':
                return new PaypalPaymentGateway();
            default:
                throw new InvalidArgumentException('Invalid payment gateway type');
        }
    }
}
  1. 現(xiàn)在,我們可以在需要使用支付網(wǎng)關(guān)的地方通過(guò)工廠類創(chuàng)建具體的實(shí)例,而不是直接實(shí)例化具體的類。這樣,我們就可以輕松地替換不同的支付網(wǎng)關(guān)實(shí)現(xiàn),而無(wú)需修改使用支付網(wǎng)關(guān)的代碼。
function processPayment(PaymentGateway $gateway, float $amount)
{
    $gateway->charge($amount);
}

// 使用 Stripe 支付網(wǎng)關(guān)
$gateway = PaymentGatewayFactory::createPaymentGateway('stripe');
processPayment($gateway, 100.00);

// 使用 PayPal 支付網(wǎng)關(guān)
$gateway = PaymentGatewayFactory::createPaymentGateway('paypal');
processPayment($gateway, 100.00);

在這個(gè)例子中,我們通過(guò)工廠模式創(chuàng)建 PaymentGateway 實(shí)例,并通過(guò)依賴注入將其實(shí)例傳遞給 processPayment 函數(shù)。這樣,我們就可以輕松地更改使用的支付網(wǎng)關(guān),而無(wú)需修改 processPayment 函數(shù)的代碼。

0