Fabbrica condizionale

0

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?

    
posta marcosh 31.05.2016 - 12:41
fonte

1 risposta

1

Sebbene per la maggior parte dei casi il secondo approccio sia probabilmente migliore, i casi in cui si desidera nascondere i dettagli dell'implementazione recuperando un'interfaccia generica da un metodo passando un flag (utilizzato per scegliere l'implementazione corretta) e i dati in una fabbrica, questo sembra più simile a una regola aziendale e in quanto tale il primo approccio sarebbe la soluzione ideale qui.

La chiave qui è identificare se stai introducendo rigorosamente un'astrazione o introducendo una limitazione al codice (forse da una user story), che deve essere seguita. Nel tuo caso è quest'ultimo e in quanto tale appartiene al tuo livello di business logic, non al luogo in cui viene costruito il grafo degli oggetti.

    
risposta data 31.05.2016 - 13:03
fonte

Leggi altre domande sui tag