# फ़ैक्टरी पैटर्न — एडवांस्ड जावा

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

> ऑब्जेक्ट निर्माण को किसी मेथड या क्लास के पीछे छुपाएँ ताकि कॉलर किसी इंटरफ़ेस पर निर्भर हों, कंक्रीट कंस्ट्रक्टर पर नहीं, जिससे implementation बदलना आसान हो।

## 'क्या' को 'कैसे बना' से अलग करें

**फ़ैक्टरी मेथड** इंटरफ़ेस टाइप लौटाता है जबकि अंदर तय करता है कौन-सी कंक्रीट क्लास बनानी है। कॉलर सीधे `new ConcreteThing()` कभी नहीं करते, इसलिए नई implementation बिना क्लाइंट कोड छुए जोड़ी जा सकती है।

## एक पेमेंट फ़ैक्टरी

फ़ैक्टरी उस `if`/`switch` को एक ही जगह रखती है जो implementation चुनता है — वह लॉजिक हर कॉल साइट पर कॉपी-पेस्ट होने के बजाय एक ही बार मौजूद रहता है।

```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);
```
