Devo eseguire un pagamento e ho due metodi di pagamento: FirstPayment
e TokenPayment
, che implementano entrambi PaymentInterface
interface PaymentInterface
{
public function pay(PaymentRequest $request);
}
In base a una condizione specifica su PaymentRequest
devo scegliere se utilizzare FirstPayment
di TokenPayment
.
Il cliente che richiede il pagamento non dovrebbe sapere quale implementazione utilizzare.
Ho due idee a riguardo.
1) Potrei avere un'altra implementazione di PaymentInterface
come
class Payment implements PaymentInterface
{
public function pay(PaymentRequest $request)
{
if ($request->isFirstPayment()) {
$this->firstPayment->pay($request);
} else {
$this->tokenPayment->pay($request);
}
}
}
dove $this->firstPayment
e $this->tokenPayment
sono istanze di FirstPayment
e TokenPayment
rispettivamente.
Quindi il client potrebbe quindi semplicemente fare
$payment->pay($paymentRequest);
2) Avere una fabbrica
class PaymentFactory
{
public static function choosePayment(PaymentRequest $request)
{
if ($request->isFirstPayment()) {
return new FirstPayment();
}
return new TokenPayment();
}
}
e usalo come
$payment = PaymentFactory::choosePayment($paymentRequest);
$payment->pay($paymentRequest);
A mio parere entrambe le opzioni hanno alcuni pro e contro ... Cosa ne pensi?