# Factory Pattern — Advanced Java

Source: https://www.geekswithgeeks.com/en/advanced-java/adv-factory-pattern

> Hide object construction behind a method or class so callers depend on an interface, not a concrete constructor, making it easy to swap implementations.

## Decouple 'what' from 'how it's built'

A **factory method** returns an interface type while deciding internally which concrete class to instantiate. Callers never call `new ConcreteThing()` directly, so a new implementation can be added without touching client code.

## A payment factory

The factory centralises the `if`/`switch` that picks an implementation — that logic exists exactly once instead of being copy-pasted at every call site.

```java
interface PaymentGateway { void charge(int cents); }

class PaymentGatewayFactory {
    static PaymentGateway create(String provider) {
        return switch (provider) {
            case "stripe" -> new StripeGateway();
            case "paypal" -> new PayPalGateway();
            default -> throw new IllegalArgumentException(provider);
        };
    }
}

PaymentGateway gw = PaymentGatewayFactory.create("stripe");
gw.charge(500);
```
