पाठ 25 / 38

फ़ैक्टरी पैटर्न

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

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

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

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

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

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