प्रेरणाओं में अंतर को समझें:
मान लीजिए कि आप एक उपकरण का निर्माण कर रहे हैं जहाँ आपके पास वस्तुएँ हैं और वस्तुओं के अंतर्संबंधों का एक ठोस कार्यान्वयन है। चूंकि आप वस्तुओं में विविधता का अनुमान लगाते हैं, इसलिए आपने ऑब्जेक्ट के वेरिएंट को किसी अन्य ऑब्जेक्ट को बनाने की जिम्मेदारी सौंपकर एक अप्रत्यक्ष ( हम इसे अमूर्त कारखाना कहते हैं ) बनाया है। जब आप भविष्य में उन वस्तुओं के वेरिएंट की आवश्यकता के बारे में सोचते हैं, तो यह अमूर्तता मजबूत लाभ पाती है।
विचारों की इस पंक्ति में एक और पेचीदा प्रेरणा एक ऐसा मामला है जहां हर-या-पूरे समूह में से कोई भी ऑब्जेक्ट का एक संगत संस्करण नहीं होगा। कुछ स्थितियों के आधार पर, किसी भी प्रकार के वेरिएंट का उपयोग किया जाएगा और प्रत्येक मामले में सभी ऑब्जेक्ट एक ही प्रकार के होने चाहिए। यह समझने के लिए थोड़ा सा सहज हो सकता है क्योंकि हम अक्सर सोचते हैं कि - जब तक किसी वस्तु के वेरिएंट एक समान यूनिफ़ॉर्म कॉन्ट्रैक्ट ( व्यापक अर्थों में इंटरफ़ेस ) का पालन करते हैं, तब तक कंक्रीट कार्यान्वयन कोड कभी नहीं टूटना चाहिए। यहाँ दिलचस्प तथ्य यह है कि, यह हमेशा सच नहीं होता है, खासकर जब अपेक्षित व्यवहार को प्रोग्रामिंग अनुबंध द्वारा मॉडलिंग नहीं किया जा सकता है।
एक सरल ( GoF से विचार उधार लेना ) किसी भी GUI अनुप्रयोगों का कहना है कि एक आभासी मॉनिटर है जो एमएस या मैक या फेडोरा ओएस के लुक-ए-फील का अनुकरण करता है। यहाँ, उदाहरण के लिए, जब सभी विजेट ऑब्जेक्ट जैसे कि विंडो, बटन आदि में MS वैरिएंट होता है सिवाय एक स्क्रॉल-बार के जो मैक वेरिएंट से लिया जाता है, टूल का उद्देश्य बुरी तरह से विफल हो जाता है।
इन उपरोक्त मामलों से एब्सट्रैक्ट फैक्ट्री पैटर्न की मूलभूत आवश्यकता बनती है ।
दूसरी ओर, कल्पना करें कि आप एक रूपरेखा लिख रहे हैं ताकि कई लोग आपके ढांचे का उपयोग करके विभिन्न उपकरण ( जैसे ऊपर दिए गए उदाहरणों में से एक ) का निर्माण कर सकें । किसी ढांचे के विचार से, आपको अपने तर्क में ठोस वस्तुओं का उपयोग नहीं करने की आवश्यकता नहीं है। आप विभिन्न वस्तुओं के बीच कुछ उच्च स्तरीय अनुबंध रखते हैं और वे किस प्रकार परस्पर क्रिया करते हैं। जब आप ( एक फ्रेमवर्क डेवलपर के रूप में ) बहुत सार स्तर पर रहते हैं, तो टूल के प्रत्येक बिल्डरों को आपके फ्रेमवर्क-कंस्ट्रक्शंस का पालन करने के लिए मजबूर किया जाता है। हालांकि, उन्हें ( टूल बिल्डरों को ) यह तय करने की स्वतंत्रता है कि किस वस्तु का निर्माण किया जाए और वे सभी वस्तुओं को कैसे बनाएंगे। पिछले मामले ( एब्सट्रैक्ट फ़ैक्टरी पैटर्न ) के विपरीत , आप ( फ्रेमवर्क निर्माता के रूप में )) इस मामले में ठोस वस्तुओं के साथ काम करने की आवश्यकता नहीं है; और बल्कि वस्तुओं के अनुबंध स्तर पर रह सकते हैं। इसके अलावा, पिछले प्रेरणाओं के दूसरे भाग के विपरीत, आपको या टूल-बिल्डरों को कभी भी वेरिएंट से ऑब्जेक्ट मिलाने की स्थिति नहीं आती है। यहां, जबकि फ्रेमवर्क कोड अनुबंध स्तर पर रहता है, प्रत्येक उपकरण-निर्माता अपने स्वयं के ऑब्जेक्ट का उपयोग करने के लिए प्रतिबंधित है ( मामले की प्रकृति से )। इस मामले में ऑब्जेक्ट क्रिएशन प्रत्येक कार्यान्वयनकर्ता और फ्रेमवर्क प्रदाताओं को सौंपे जाते हैं, जो केवल वस्तुओं को बनाने और वापस करने के लिए समान तरीके प्रदान करते हैं। फ्रेमवर्क डेवलपर को अपने कोड के साथ आगे बढ़ने के लिए इस तरह के तरीके अपरिहार्य हैं और इसका एक विशेष नाम है फैक्टरी विधि ( अंतर्निहित पैटर्न के लिए फैक्टरी विधि पैटर्न )।
कुछ नोट:
- यदि आप 'टेम्प्लेट विधि' से परिचित हैं, तो आप देखेंगे कि किसी भी प्रकार की रूपरेखा से संबंधित कार्यक्रमों के मामले में फ़ैक्टरी विधियों को अक्सर टेम्प्लेट विधियों से लागू किया जाता है। इसके विपरीत, एप्लिकेशन-प्रोग्राम के टेम्पलेट तरीके अक्सर विशिष्ट एल्गोरिथ्म के सरल कार्यान्वयन और कारखाने-विधियों के शून्य होते हैं।
- इसके अलावा, विचारों की पूर्णता के लिए, फ्रेमवर्क ( ऊपर उल्लिखित ) का उपयोग करते हुए , जब एक उपकरण-निर्माता एक उपकरण का निर्माण कर रहा है, प्रत्येक फैक्ट्री विधि के अंदर, एक ठोस वस्तु बनाने के बजाय, वह एक सार को जिम्मेदारी सौंप सकता है। -फैक्टिव ऑब्जेक्ट, बशर्ते उपकरण-बिल्डर भविष्य के एक्सटेंशन के लिए कंक्रीट ऑब्जेक्ट्स की विविधताएं प्रदान करता है।
नमूना कोड:
//Part of framework-code
BoardGame {
Board createBoard() //factory method. Default implementation can be provided as well
Piece createPiece() //factory method
startGame(){ //template method
Board borad = createBoard()
Piece piece = createPiece()
initState(board, piece)
}
}
//Part of Tool-builder code
Ludo inherits BoardGame {
Board createBoard(){ //overriding of factory method
//Option A: return new LudoBoard() //Lodu knows object creation
//Option B: return LudoFactory.createBoard() //Lodu asks AbstractFacory
}
….
}
//Part of Tool-builder code
Chess inherits BoardGame {
Board createBoard(){ //overriding of factory method
//return a Chess board
}
….
}