सरल फ़ैक्टरी डिज़ाइन पैटर्न नहीं है। यह बस ऑब्जेक्ट निर्माण को क्लाइंट कोड से अलग कर देता है। दूसरे शब्दों में, सिंपल फ़ैक्टरी इन्स्टेन्शियशन लॉजिक को एक अलग वर्ग में ले जाकर ऑब्जेक्ट इन्स्टेन्शियशन को संपुटित करती है।
सरल फ़ैक्टरी को अक्सर फ़ैक्टरी पैटर्न के साथ भ्रमित किया जाता है। हम उनके अंतर को स्पष्ट करने के लिए सरल कारखाने का अध्ययन करने जा रहे हैं। साथ ही, सिंपल फैक्ट्री सीखने से हमें फैक्ट्री पैटर्न को आसानी से समझने में मदद मिलती है।
ठोस कार्यान्वयन के लिए प्रोग्रामिंग से बचना चाहिए क्योंकि इससे एप्लिकेशन को बनाए रखना बहुत मुश्किल हो जाता है। इंटरफ़ेस के लिए प्रोग्राम करना हमेशा बेहतर होता है। यदि आप क्लाइंट कोड में एक ठोस क्लास को इंस्टेंट कर रहे हैं, तो सिंपल फैक्ट्री काम में आती है क्योंकि सिंपल फैक्ट्री क्लाइंट से ऑब्जेक्ट निर्माण को अलग कर सकती है। यह हमारे एप्लिकेशन को अधिक विस्तार योग्य और रखरखाव योग्य बनाता है।
हम बर्गर शॉप के लिए सिस्टम विकसित कर रहे हैं। सिस्टम को विभिन्न बर्गर जैसे बीफ़ बर्गर, चिकन बर्गर इत्यादि बनाने की आवश्यकता है।
हमारा पहला प्रयास इस प्रकार होगा:
// Client orders a burger Burger orderBurger(String type) { Burger burger; if (type.equals("beef")) { burger = new BeefBurger(); } else if (type.equals("chicken")) { burger = new ChickenBurger(); } else if (type.equals("fish")) { burger = new FishBurger(); } burger.prepareBun(); burger.grillPatty(); burger.addToppings(); burger.wrap(); return burger; }
समस्या यह है कि हम कार्यान्वयन के लिए कोडिंग कर रहे हैं, इंटरफ़ेस के लिए नहीं। कहाँ? हम if स्टेटमेंट का उपयोग करते हैं और बर्गर प्रकार के आधार पर एक ठोस वर्ग को इंस्टेंट करते हैं।
यह समस्या क्यों है? हमारा क्लाइंट कोड ऑब्जेक्ट निर्माण के साथ मजबूती से जुड़ा हुआ है, जिससे लचीलापन कम हो गया है!! मान लीजिए कि हम अब मछली बर्गर नहीं बेचते हैं, और वेजी बर्गर बेचना शुरू कर देते हैं। हमें अपने क्लाइंट कोड पर जाकर उसे संशोधित करना होगा। कहने का तात्पर्य यह है कि यह संशोधन के लिए बंद नहीं है।
समस्या को हल करने के लिए, हम अलग वर्ग बना सकते हैं जो केवल ऑब्जेक्ट निर्माण के लिए जिम्मेदार होगा। तब हमारे क्लाइंट कोड को ऑब्जेक्ट निर्माण के बारे में चिंता करने की आवश्यकता नहीं है और वह अमूर्तता पर निर्भर रहने में सक्षम है। इस तकनीक को "जो बदलता है उसे एनकैप्सुलेट करें" के रूप में जाना जाता है। हम उम्मीद करते हैं कि ठोस वस्तुओं को इंस्टेंट करने के बारे में कोड बार-बार बदला जाएगा, जबकि भविष्य में सभी बर्गर के बीच तैयारबुन(), ग्रिलपैटी(), ऐडटॉपिंग्स(), रैप() प्रक्रियाएं समान रहने की संभावना है।
सिंपल फ़ैक्टरी का लाभ यह है कि यह अन्य वर्गों द्वारा पुन: प्रयोज्य है। हमारे पास बर्गर रेस्तरां, बर्गर कैटरिंगशॉप जैसे अन्य क्लाइंट वर्ग हो सकते हैं जो SimpleBurgerFactory.createBurger() विधि का उपयोग करेंगे।
ग्राहक
क्लाइंट SimpleBurgerFactory के माध्यम से विशिष्ट बर्गर ऑब्जेक्ट को इंस्टेंटिएट करता है। क्लाइंट के नजरिए से ध्यान दें, हम नहीं जानते कि कौन सा ठोस बर्गर बनाया जाएगा, यानी, ऑब्जेक्ट निर्माण तर्क अब क्लाइंट से अलग हो गया है।
सिंपलबर्गरफैक्ट्री
यह वर्ग इस मामले में जो भिन्न होता है, उसे समाहित करता है, वस्तु निर्माण तर्क! createBurger() को स्थिर विधि के रूप में घोषित किया गया है क्योंकि क्लाइंट इस क्लास का उपयोग ऑब्जेक्ट को इंस्टेंट करने के लिए करना चाहता है (निश्चित रूप से इसे इंस्टेंट करने से पहले हमारे पास कोई इंस्टेंस नहीं हो सकता है!)। किस प्रकार का बर्गर बनाया जाना चाहिए यह निर्धारित करने के लिए createBurger() बर्गरटाइप एनम को स्वीकार करता है।
बर्गर
यह अमूर्त वर्ग सभी बर्गरों के बीच सामान्य इंटरफ़ेस प्रदान करता है और डिफ़ॉल्ट व्यवहार को परिभाषित करता है।
बर्गर उपवर्ग
यहां हमारे ठोस उत्पाद हैं। जब तक वे बर्गर वर्ग का विस्तार करते हैं, तब तक वे ओवरराइडिंग विधियों द्वारा विशिष्ट व्यवहार लागू कर सकते हैं।
public enum BurgerType { BEEF, CHICKEN, FISH, VEGGIE }
// Abstract Product public abstract class Burger { public BurgerType burgerType; public Listtoppings = new ArrayList(); public void prepareBun() { System.out.println("Preparing a bun"); } public void grillPatty() { if (burgerType == null) { throw new IllegalStateException("pattyType is undefined"); } System.out.println("Grill a " burgerType " patty"); } public void addToppings() { for (String item : toppings) { System.out.println("Add " item); } } public void wrap() { System.out.println("Wrap a burger up"); } }
// Concrete product public class BeefBurger extends Burger { public BeefBurger() { burgerType = BurgerType.BEEF; Listitems = List.of("lettuce", "pickle slices", "tomato slice", "BBQ sauce"); toppings.addAll(items); } }
// Concrete product public class VeggieBurger extends Burger { public VeggieBurger() { burgerType = BurgerType.VEGGIE; Listitems = List.of("smoked paprika", "garlic chips", "crushed walnuts", "veggie sauce"); toppings.addAll(items); } // Concrete product can implement specific behavior that differs from other products @Override public void wrap() { System.out.println("Wrapping paper shouldn't print any meats but vegetables"); } }
// Simple factory, responsible for instantiating an object public class SimpleBurgerFactory { public static Burger createBurger(BurgerType type) { return switch (type) { case BEEF -> new BeefBurger(); case CHICKEN -> new ChickenBurger(); case FISH -> new FishBurger(); case VEGGIE -> new VeggieBurger(); default -> throw new IllegalArgumentException("unknown burger type"); }; } }
public class Client { public static void main(String[] args) { Burger burger = orderBurger(BurgerType.VEGGIE); System.out.println(burger); // Check if the object is actually veggie burger } public static Burger orderBurger(BurgerType type) { // Factory is responsible for object creation Burger burger = SimpleBurgerFactory.createBurger(type); burger.prepareBun(); burger.grillPatty(); burger.addToppings(); burger.wrap(); return burger; } }
आउटपुट:
Preparing a bun Grill a VEGGIE patty Add smoked paprika Add garlic chips Add crushed walnuts Add veggie sauce Wrapping paper shouldn't print any meats but vegetables com.factories.simpleFactory.VeggieBurger@9807454
आप यहां सभी डिज़ाइन पैटर्न कार्यान्वयन की जांच कर सकते हैं।
GitHub रिपोजिटरी
पी.एस.
मैं तकनीकी ब्लॉग लिखने में नया हूँ, यदि मेरे लेखन को बेहतर बनाने के लिए आपके पास कोई सलाह हो, या कोई भ्रमित करने वाली बात हो, तो कृपया एक टिप्पणी छोड़ें!
पढ़ने के लिए आपका शुक्रिया :)
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3