PaymentCheckout.java

package com.designpatterns.creational.factorymethod.applied;

import java.util.Map;

public class PaymentCheckout {

    private final Map<PaymentMethod, PaymentProviderCreator> creators;

    public PaymentCheckout(Map<PaymentMethod, PaymentProviderCreator> creators) {
        this.creators = Map.copyOf(creators);
    }

    public static PaymentCheckout withDefaultCreators() {
        return new PaymentCheckout(Map.of(
                PaymentMethod.PIX, new PixPaymentProviderCreator(),
                PaymentMethod.BOLETO, new BoletoPaymentProviderCreator(),
                PaymentMethod.CREDIT_CARD, new CreditCardPaymentProviderCreator()
        ));
    }

    public String charge(PaymentMethod method, long amountCents) {
        PaymentProviderCreator creator = creators.get(method);
        if (creator == null) {
            throw new IllegalArgumentException("no provider creator registered for " + method);
        }
        return creator.charge(amountCents);
    }
}