在PHP中,工廠模式是一種創建型設計模式,它提供了一種在不指定具體類的情況下創建對象的方法。依賴注入(Dependency Injection,DI)是一種實現控制反轉(Inversion of Control,IoC)的技術,它允許我們將對象的依賴關系從對象內部移動到對象外部,從而使得代碼更加靈活和可測試。
下面是一個使用工廠模式和依賴注入的示例:
PaymentGateway
,它表示支付網關。然后,我們創建兩個實現該接口的類:StripePaymentGateway
和 PaypalPaymentGateway
。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 支付邏輯
}
}
PaymentGatewayFactory
,它負責根據配置或請求參數創建適當的 PaymentGateway
實例。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');
}
}
}
function processPayment(PaymentGateway $gateway, float $amount)
{
$gateway->charge($amount);
}
// 使用 Stripe 支付網關
$gateway = PaymentGatewayFactory::createPaymentGateway('stripe');
processPayment($gateway, 100.00);
// 使用 PayPal 支付網關
$gateway = PaymentGatewayFactory::createPaymentGateway('paypal');
processPayment($gateway, 100.00);
在這個例子中,我們通過工廠模式創建 PaymentGateway
實例,并通過依賴注入將其實例傳遞給 processPayment
函數。這樣,我們就可以輕松地更改使用的支付網關,而無需修改 processPayment
函數的代碼。