क्या कोई फैक्ट्री और रणनीति पैटर्न के बीच अंतर बता सकता है?
मेरे लिए दोनों एक अतिरिक्त फैक्ट्री क्लास (जो कि फैक्ट्री पैटर्न में उत्पाद का एक ऑब्जेक्ट बनाते हैं) के अलावा अन्य समान दिख रहे हैं।
क्या कोई फैक्ट्री और रणनीति पैटर्न के बीच अंतर बता सकता है?
मेरे लिए दोनों एक अतिरिक्त फैक्ट्री क्लास (जो कि फैक्ट्री पैटर्न में उत्पाद का एक ऑब्जेक्ट बनाते हैं) के अलावा अन्य समान दिख रहे हैं।
जवाबों:
एक फैक्टरी पैटर्न एक रचनात्मक पैटर्न है। एक रणनीति पैटर्न एक परिचालन पैटर्न है। एक और तरीका रखो, एक फ़ैक्टरी पैटर्न का उपयोग विशिष्ट प्रकार की वस्तुओं को बनाने के लिए किया जाता है। एक रणनीति पैटर्न का उपयोग किसी विशेष तरीके से एक ऑपरेशन (या संचालन का सेट) करने के लिए किया जाता है। क्लासिक उदाहरण में, एक कारखाना विभिन्न प्रकार के जानवरों का निर्माण कर सकता है: डॉग, कैट, टाइगर, जबकि एक रणनीति पैटर्न विशेष क्रियाएं करेगा, उदाहरण के लिए, हटो; रन, वॉक या लोप रणनीतियों का उपयोग करना।
वास्तव में दोनों का एक साथ उपयोग किया जा सकता है। उदाहरण के लिए, आपके पास एक कारखाना हो सकता है जो आपके व्यवसाय की वस्तुओं को बनाता है। यह दृढ़ता माध्यम पर आधारित विभिन्न रणनीतियों का उपयोग कर सकता है। यदि आपका डेटा XML में स्थानीय रूप से संग्रहीत है, तो यह एक रणनीति का उपयोग करेगा। यदि डेटा एक अलग डेटाबेस में दूरस्थ था, तो यह दूसरे का उपयोग करेगा।
रणनीति का पैटर्न आपको एक वर्ग के बहुरूपिए व्यवहार को बदलने की अनुमति देता है।
फैक्टरी पैटर्न आपको ऑब्जेक्ट निर्माण को एनकैप्सुलेट करने की अनुमति देता है।
गैरी एक महान बिंदु बनाता है। यदि आप "समवर्ती" के बजाय अमूर्त को कोडिंग के सिद्धांत का उपयोग कर रहे हैं, तो बहुत सारे पैटर्न एक विषय पर बदलाव की तरह लगने लगते हैं।
केवल उस तवान्फोसन को जोड़ने के लिए, बहुत सारे पैटर्न कार्यान्वयन के समान ही दिखते हैं। यही है, बहुत कुछ आपने एक इंटरफ़ेस बनाया है जहां शायद आपके कोड में पहले कोई नहीं था, और फिर उस इंटरफ़ेस के कार्यान्वयन का एक गुच्छा बनाएं। अंतर उनके उद्देश्य में है और उनका उपयोग कैसे किया जाता है।
केवल ठोस उदाहरण बनाएँ। अलग-अलग तर्क अलग-अलग वस्तुओं में हो सकते हैं। यह तर्क आदि पर निर्भर करता है।
एक्शन करने के लिए एल्गोरिथ्म (कदम) को इनकैप्सुलेट करें। इसलिए आप रणनीति बदल सकते हैं और दूसरे एल्गोरिथ्म का उपयोग कर सकते हैं।
जबकि दोनों बहुत समान दिखते हैं, उद्देश्य अलग-अलग होता है, एक उद्देश्य यह है कि दूसरे का निर्माण एक क्रिया करना है।
इसलिए। यदि आपका कारखाना तरीका तय हो गया है, तो आपके पास ऐसा हो सकता है:
public Command getCommand( int operatingSystem ) {
switch( operatingSystem ) {
case UNIX :
case LINUX : return new UnixCommand();
case WINDOWS : return new WindowsCommand();
case OSX : return new OSXCommand();
}
}
लेकिन मान लें कि आपके कारखाने को अधिक उन्नत या गतिशील निर्माण की आवश्यकता है। आप फ़ैक्टरी विधि में एक रणनीति जोड़ सकते हैं और इसे बिना बदले में बदल सकते हैं, रणनीति रनटाइम पर बदल सकती है।
सबसे पहले साधारण कारखाने और अमूर्त कारखाने के बीच अंतर करना चाहिए। पहला एक साधारण कारखाना है जहां आपके पास केवल एक वर्ग होता है जो ऑब्जेक्ट निर्माण के लिए एक कारखाने के रूप में कार्य करता है, जबकि उत्तरार्द्ध में आप एक कारखाने इंटरफ़ेस (जो विधि के नाम को परिभाषित करता है) से जुड़ते हैं और फिर इस इंटरफ़ेस को लागू करने वाले विभिन्न कारखानों को कॉल करते हैं माना जाता है कि कुछ मानदंडों के आधार पर एक ही विधि के अलग-अलग कार्यान्वयन होते हैं। उदाहरण के लिए, हमारे पास एक ButtonCreationFactory इंटरफ़ेस है, जो दो कारखानों द्वारा कार्यान्वित किया जाता है, पहला WindowsButtonCreationFactory (विंडोज लुक और फील के साथ बटन बनाता है) और दूसरा LinuxButtonCreationFactory (लिनक्स लुक और फील के साथ बटन बनाता है)। इसलिए इन दोनों कारखानों में अलग-अलग कार्यान्वयन (एल्गोरिदम) के साथ एक ही निर्माण विधि है।
उदाहरण के लिए यदि आप लिनक्स लुक और फील वाले बटन चाहते हैं:
ButtonCreationFactory myFactory = new LinuxButtonCreationFactory();
Button button1 = myFactory.createButton(...);
या यदि आप विंडोज बटन चाहते हैं
ButtonCreationFactory myFactory = new WindowsButtonCreationFactory();
Button button1 = myFactory.createButton(...);
वास्तव में इस मामले में, यह एक प्रकार की रणनीति पैटर्न का परिणाम है, क्योंकि यह कुछ निर्माण करने के लिए एल्गोरिदम को अलग करता है। हालाँकि, यह शब्दार्थ से भिन्न है क्योंकि इसका उपयोग ऑपरेशनल एल्गोरिदम के बजाय OBJECT CREATION के लिए किया जाता है। तो, मूल रूप से अमूर्त कारखाने के साथ आपके पास विभिन्न रणनीतियों का उपयोग करके ऑब्जेक्ट निर्माण होता है, जो इसे रणनीति पैटर्न के समान बनाता है। हालांकि एब्सट्रैक्ट रचनात्मक है, जबकि स्ट्रैटेजी पैटर्न चालू है। कार्यान्वयन बुद्धिमान, वे एक ही परिणाम हो।
फैक्टरी (और FactoryMethod कारखाने द्वारा लौटा) :
इस विकिपीडिया लेख और javarevisited लेख पर एक नज़र है
रणनीति पैटर्न:
उदाहरण:
आप किसी विशेष आइटम (AirFare टिकट या ShoppingCart आइटम) के लिए डिस्काउंट रणनीति को कॉन्फ़िगर कर सकते हैं। इस उदाहरण में, आप जुलाई - दिसंबर के दौरान किसी आइटम पर 25% की छूट और जूनरी - जून के दौरान आइटम पर कोई छूट प्रदान करेंगे।
संबंधित पोस्ट:
ऑस्कर ने अपने कोड के संदर्भ में क्या कहा और कैसे बढ़ाया जाए:
GetCommand फैक्टरी है और UnixCommand, WindowsCommand और OSXCommand कक्षाएं रणनीतियाँ हैं
आप केवल कोड या वर्गीकरण को देखकर अंतर को नहीं समझ सकते हैं। GoF पैटर्न को सही ढंग से समझने के लिए, उनके इरादों को देखें:
रणनीति: "एल्गोरिदम के एक परिवार को परिभाषित करें, हर एक को एनकैप्सुलेट करें और उन्हें विनिमेय बनाएं। रणनीति एल्गोरिथ्म का उपयोग करने वाले ग्राहकों से स्वतंत्र रूप से भिन्न होने देती है।"
फ़ैक्टरी विधि: "ऑब्जेक्ट बनाने के लिए एक इंटरफ़ेस को परिभाषित करें, लेकिन उपवर्गों को यह तय करने दें कि कौन सी क्लास को तात्कालिक बनाना है। फैक्ट्री मेथड एक क्लास को सबक्लासेस को तत्काल स्थगित करने देता है।"
और यहां इन दोनों पैटर्न के बीच अंतर और अंतर के बारे में विस्तृत विवरण दिया गया है: फैक्टरी विधि और रणनीति डिजाइन पैटर्न के बीच अंतर
मैं ऑस्कर से पचा सकता हूं कि फैक्ट्री कार्यान्वयन का उनका उदाहरण बल्कि कसकर युग्मित है और बहुत ही बंद है, कोई आश्चर्य नहीं कि आपकी पिक स्ट्रैटेजी पैटर्न है। फ़ैक्टरी कार्यान्वयन किसी भी निश्चित संख्या पर निर्भर नहीं होना चाहिए, जो विशिष्ट वर्गों के लिए तत्काल किया जा रहा है, उदाहरण के लिए:
public Command getCommand( int operatingSystem ) {
return commandTable.get(operatingSystem);
}
...
public class WindowsCommand implements Command {
...
static {
CommandTable.getInstance().registerCommand(WIN_COMMAND_ID, new WindowsCommand());
}
}
मुझे लगता है कि किसी एक या दूसरे को चुनने के लिए सबसे उपयुक्त मानदंड हैं, ज्यादातर आप अपनी कक्षाओं और विधियों को नाम देने के लिए नियोजित होते हैं, इस बात को ध्यान में रखते हुए कि हम सभी को कार्यक्रम में भाग लेना चाहिए और कक्षाओं में नहीं और लक्ष्य पर भी ध्यान केंद्रित करना चाहिए: हम निर्धारित करने का लक्ष्य रखते हैं कौन सा कोड रनटाइम पर निष्पादित करेगा। उन्होंने कहा, हम दोनों में से किसी भी पैटर्न का उपयोग करके लक्ष्य को प्राप्त कर सकते हैं।
रणनीति और फैक्टरी विभिन्न उद्देश्य हैं। रणनीति में आपके पास परिभाषित दृष्टिकोण है, इस पैटर्न का उपयोग करके आप व्यवहार (एल्गोरिदम) को इंटरचेंज कर सकते हैं। फैक्ट्री में आने के आसपास बहुत विविधताएं हैं। लेकिन जीओ 4 राज्यों के कारखाने से मूल पैटर्न बाल वर्ग के लिए वस्तु का निर्माण छोड़ देता है। यहां उस फैक्ट्री के साथ जिसे आप पूरी तरह से बदल रहे हैं न कि आप जिस व्यवहार में रुचि रखते हैं। इसके द्वारा आप पूरी प्रणाली की जगह लेंगे एल्गोरिथ्म नहीं।
फैक्टरी पैटर्न एक रचनात्मक पैटर्न है, जो निर्दिष्ट गुणों (व्यवहार) के साथ बनाया गया है। निर्माण समय के बाद रन टाइम के दौरान यह गुण (व्यवहार) नहीं बदला है। इसलिए यदि आपको अलग-अलग गुणों (व्यवहार) की आवश्यकता है तो आपको ऑब्जेक्ट को हटाना होगा और आवश्यक गुणों (व्यवहार) के साथ नई ऑब्जेक्ट बनाना होगा। जो अशिष्ट नहीं है। जबकि रणनीति पैटर्न के मामले में आप रन टाइम पर संपत्तियों (व्यवहार) को बदल सकते हैं।