PaymentProviderCreator.java

package com.designpatterns.creational.factorymethod.applied;

/**
 * The shared step (amount validation) lives here once; only which {@link PaymentProvider} gets
 * created varies by subclass. New payment methods add a new creator, they never touch this
 * validation.
 */
public abstract class PaymentProviderCreator {

    public final String charge(long amountCents) {
        if (amountCents <= 0) {
            throw new IllegalArgumentException("amountCents must be positive");
        }
        PaymentProvider provider = createProvider();
        return provider.processPayment(amountCents);
    }

    protected abstract PaymentProvider createProvider();
}