कारखानों के कई फायदे हैं जो कुछ स्थितियों में सुरुचिपूर्ण अनुप्रयोग डिजाइनों की अनुमति देते हैं। एक यह है कि आप उन वस्तुओं के गुणों को निर्धारित कर सकते हैं जिन्हें आप बाद में एक जगह बनाकर एक फैक्ट्री बनाना चाहते हैं, और फिर उस फैक्ट्री को चारों ओर सौंप दें। लेकिन अक्सर आपको वास्तव में ऐसा करने की आवश्यकता नहीं होती है। वास्तव में बदले में आपको कुछ भी दिए बिना केवल एक फैक्ट्री का उपयोग करने से उस स्थिति में अतिरिक्त जटिलता बढ़ जाती है। चलो इस कारखाने को लेते हैं, उदाहरण के लिए:
WidgetFactory redWidgetFactory = new ColoredWidgetFactory(COLOR_RED);
Widget widget = redWidgetFactory.create();
फैक्ट्री पैटर्न का एक विकल्प बहुत समान बिल्डर पैटर्न है। मुख्य अंतर यह है कि फैक्टरी द्वारा निर्मित वस्तुओं के गुणों को तब सेट किया जाता है जब फैक्टरी को इनिशियलाइज़ किया जाता है, जबकि एक बिल्डर को डिफ़ॉल्ट राज्य के साथ आरम्भ किया जाता है और सभी गुण बाद में सेट किए जाते हैं।
WidgetBuilder widgetBuilder = new WidgetBuilder();
widgetBuilder.setColor(COLOR_RED);
Widget widget = widgetBuilder.create();
लेकिन जब ओवरगेंरिंग आपकी समस्या है, तो एक बिल्डर के साथ एक कारखाने की जगह में सुधार की संभावना नहीं है।
या तो पैटर्न के लिए सबसे सरल प्रतिस्थापन new
ऑपरेटर के साथ एक साधारण निर्माता के साथ ऑब्जेक्ट-इंस्टेंस बनाने के लिए है :
Widget widget = new ColoredWidget(COLOR_RED);
कंस्ट्रक्टर्स, हालांकि, अधिकांश ऑब्जेक्ट-ओरिएंटेड भाषाओं में एक महत्वपूर्ण कमी है: उन्हें उस सटीक वर्ग की एक वस्तु वापस करनी चाहिए और एक उप-प्रकार वापस नहीं कर सकते।
जब आपको रन-टाइम पर उप-प्रकार का चयन करने की आवश्यकता होती है, लेकिन उसके लिए एक नया बिल्डर या फ़ैक्टरी वर्ग बनाने का सहारा नहीं लेना चाहते, तो आप इसके बजाय फ़ैक्टरी-विधि का उपयोग कर सकते हैं। यह एक वर्ग का एक स्थिर तरीका है जो उस वर्ग या उसके उप-वर्गों में से एक का एक नया उदाहरण देता है। एक कारखाना जो किसी भी आंतरिक स्थिति को बनाए नहीं रखता है, उसे अक्सर ऐसे कारखाने-विधि से बदला जा सकता है:
Widget widget = Widget.createColoredWidget(COLOR_RED); // returns an object of class RedColoredWidget
जावा 8 में एक नई सुविधा विधि संदर्भ हैं जो आपको तरीकों को पास करने की अनुमति देते हैं, जैसे आप एक स्टेटलेस फैक्ट्री के साथ करते हैं। आसानी से, जो कुछ भी एक विधि संदर्भ को स्वीकार करता है वह किसी भी वस्तु को स्वीकार करता है जो समान कार्यात्मक इंटरफ़ेस को लागू करता है, जो आंतरिक स्थिति के साथ एक पूर्ण कारखाना भी हो सकता है, इसलिए आप बाद में कारखानों को आसानी से पेश कर सकते हैं, जब आप ऐसा करने का कारण देखते हैं।