94

कोई भी कारखाने और रणनीति पैटर्न के बीच अंतर को समझा सकता है?फैक्टरी और रणनीति पैटर्न के बीच क्या अंतर है?

मेरे लिए दोनों एक अतिरिक्त कारखाने वर्ग (जो कारखाने पैटर्न में उत्पाद की एक वस्तु बनाने)

उत्तर

146

एक कारखाना पैटर्न एक creational पैटर्न है की तुलना में एक ही अन्य देख रहे हैं। एक रणनीति पैटर्न एक परिचालन पैटर्न है। एक और तरीका रखो, एक विशिष्ट प्रकार की वस्तुओं को बनाने के लिए एक फैक्ट्री पैटर्न का उपयोग किया जाता है। किसी विशेष तरीके से ऑपरेशन (या संचालन का सेट) करने के लिए एक रणनीति पैटर्न का उपयोग किया जाता है। क्लासिक उदाहरण में, एक कारखाना विभिन्न प्रकार के पशु बना सकता है: कुत्ता, बिल्ली, टाइगर, जबकि एक रणनीति पैटर्न विशेष कार्यों को करेगा, उदाहरण के लिए, मूव; रन, वॉक, या लोप रणनीतियों का उपयोग करना।

वास्तव में दोनों का एक साथ उपयोग किया जा सकता है। उदाहरण के लिए, आपके पास एक कारखाना हो सकता है जो आपके व्यावसायिक वस्तुओं को बनाता है। यह दृढ़ता माध्यम के आधार पर विभिन्न रणनीतियों का उपयोग कर सकता है। यदि आपका डेटा एक्सएमएल में स्थानीय रूप से संग्रहीत है तो यह एक रणनीति का उपयोग करेगा। यदि डेटा किसी भिन्न डेटाबेस में दूरस्थ था, तो यह दूसरे का उपयोग करेगा।

20

रणनीति पैटर्न आपको कक्षा के व्यवहार को बहुरूप रूप से बदलने की अनुमति देता है।

कारखाना पैटर्न आपको वस्तु निर्माण को समाहित करने की अनुमति देता है।

गैरी एक महान बिंदु बनाता है। यदि आप "विवेकानुसार" के बजाय abstractions को कोडिंग के सिद्धांत का उपयोग कर रहे हैं तो बहुत सारे पैटर्न थीम पर विविधता की तरह दिखने लगते हैं।

15

बस tvanfosson ने जो कहा, उसे जोड़ने के लिए बहुत सारे पैटर्न कार्यान्वयन के समान दिखते हैं। यही है, आपने एक इंटरफ़ेस बनाया है जहां शायद आपके कोड में पहले कोई नहीं था, और फिर उस इंटरफ़ेस के कार्यान्वयन का एक समूह बनाएं। अंतर उनके उद्देश्य में है और उनका उपयोग कैसे किया जाता है।

9
  • फैक्ट्री (विधि) पैटर्न।

केवल ठोस उदाहरण बनाएं। विभिन्न तर्कों के परिणामस्वरूप विभिन्न वस्तुओं का परिणाम हो सकता है। यह तर्क आदि पर निर्भर करता है

  • रणनीति पैटर्न।

एक्शन करने के लिए एल्गोरिदम (चरणों) को Encapsulate। तो आप रणनीति बदल सकते हैं और एक और एल्गोरिदम का उपयोग कर सकते हैं।

जबकि दोनों बहुत समान दिखते हैं, उद्देश्य अलग-अलग है, दूसरा उद्देश्य एक क्रिया करने के लिए है।

तो। अपने फैक्टरी विधि तय हो गई है, तो आप इसे इस तरह हो सकता है:

public Command getCommand(int operatingSystem) { 
     switch(operatingSystem) { 
      case UNIX : 
      case LINUX : return new UnixCommand(); 
      case WINDOWS : return new WindowsCommand(); 
      case OSX  : return new OSXCommand(); 
     } 
    } 

लेकिन लगता है अपने कारखाने और अधिक उन्नत या गतिशील निर्माण की जरूरत है। आप फ़ैक्टरी विधि में एक रणनीति जोड़ सकते हैं और इसे पुन: संकलित किए बिना बदल सकते हैं, रणनीति रनटाइम पर बदल सकती है।

+0

मुझे लगता है कि आप एक सही यहां मुद्दा बना रहे हैं न। सबसे पहले, इन पैटर्न के कारणों में से एक पॉलिमॉर्फिज्म के पक्ष में सशर्त से बचने के लिए है। सरल फैक्ट्री और अमूर्त कारखाने के बीच सबसे पहले एक अंतर बनाया जाना चाहिए।डी पहला एक साधारण कारखाना है जहां आपके पास केवल एक वर्ग है जो ऑब्जेक्ट सृजन के लिए कारखाने के रूप में कार्य करता है, जबकि बाद में आप एक इंटरफ़ेस से कनेक्ट होते हैं और फिर विभिन्न इंटरफ़ेस को कॉल करते हैं जो इस इंटरफ़ेस को कार्यान्वित करते हैं, जिनके विभिन्न कार्यान्वयन होते हैं कुछ मानदंडों के आधार पर एक ही विधि। (जारी है) – interboy

+3

बिल्कुल इस मामले में, इसका परिणाम एक प्रकार का रणनीति पैटर्न होता है, लेकिन यह अर्थात् इससे भिन्न होता है क्योंकि इसका संचालन के बजाय ऑब्जेक्ट क्रिएशन के लिए उपयोग किया जाता है। इसलिए, मूल रूप से आपके पास विभिन्न रणनीतियों का उपयोग करके ऑब्जेक्ट सृजन है। – interboy

+0

@OscarRyz क्या आप कृपया अपने उत्तर को एक प्रोग्राम के साथ अपडेट कर सकते हैं –

2

क्या ऑस्कर कहा पर और उसके कोड के संदर्भ में विस्तार करने के लिए:

getCommand है फैक्टरी और UnixCommand, WindowsCommand और OSXCommand कक्षाएं रणनीतियाँ

1

मैं में के बारे में उनकी उदाहरण है कि ऑस्कर के साथ पीछे हटना सकता है एक कारखाना कार्यान्वयन बल्कि कसकर जोड़ दिया गया है और बहुत बंद है, कोई आश्चर्य नहीं कि आपका चयन रणनीति पैटर्न है। एक फैक्टरी कार्यान्वयन विशिष्ट वर्गों में से किसी निश्चित संख्या पर निर्भर होना चाहिए नहीं instantiated जा रहा है, उदाहरण के लिए:

public Command getCommand(int operatingSystem) {   
    return commandTable.get(operatingSystem); 
} 

... 

public class WindowsCommand implements Command { 
    ... 
    static { 
     CommandTable.getInstance().registerCommand(WIN_COMMAND_ID, new WindowsCommand()); 
    } 

} 

मैं सबसे उपयुक्त मापदंड लगता है या एक को चुनना एक और ज्यादातर मामले आप अपनी कक्षाओं और तरीकों नाम के लिए काम है, ध्यान में रखते हुए हम सभी को इंटरफेस के लिए प्रोग्राम करना चाहिए, न कि कक्षाओं के लिए और लक्ष्य पर ध्यान केंद्रित करना: हम यह निर्धारित करना चाहते हैं कि रनटाइम पर कौन सा कोड निष्पादित होगा। उस ने कहा, हम दोनों पैटर्नों का उपयोग करके लक्ष्य प्राप्त कर सकते हैं।

1

रणनीति और फैक्ट्री विभिन्न उद्देश्यों हैं। रणनीति में आपके पास इस पैटर्न का उपयोग करके परिभाषित दृष्टिकोण है, आप व्यवहार (एल्गोरिदम) का आदान-प्रदान कर सकते हैं। कारखाने में आने के आसपास बहुत सारी विविधताएं हैं। लेकिन जीओ 4 राज्य कारखाने से मूल पैटर्न बच्चे वर्ग के लिए वस्तु का निर्माण छोड़ देता है। यहां कारखाने के साथ आप पूर्ण उदाहरण को प्रतिस्थापित कर रहे हैं, जिस व्यवहार में आप रुचि रखते हैं। इससे आप पूरी प्रणाली को एल्गोरिदम नहीं बदलेंगे।

5

सरल कारखाने और अमूर्त कारखाने के बीच सबसे पहले एक अंतर बनाया जाना चाहिए। पहला एक साधारण कारखाना है जहां आपके पास केवल एक वर्ग है जो ऑब्जेक्ट सृजन के लिए कारखाने के रूप में कार्य करता है, जबकि बाद में आप फ़ैक्टरी इंटरफ़ेस से कनेक्ट होते हैं (जो विधि नाम परिभाषित करता है) और फिर विभिन्न इंटरफ़ेस को कॉल करें जो इस इंटरफ़ेस को कार्यान्वित करते हैं माना जाता है कि कुछ मानदंडों के आधार पर एक ही विधि के विभिन्न कार्यान्वयन होते हैं। उदाहरण के लिए, हमारे पास एक बटन क्रिएशन फैक्टरी इंटरफ़ेस है, जिसे दो कारखानों द्वारा लागू किया गया है, पहला विंडोजबटन क्रिएशन फैक्टरी (विंडोज लुक और महसूस के साथ बटन बनाता है) और दूसरा लिनक्सबटन क्रिएशन फैक्टरी (लिनक्स लुक और महसूस के साथ बटन बनाता है)। तो इन दोनों कारखानों में अलग-अलग कार्यान्वयन (एल्गोरिदम) के साथ एक ही निर्माण विधि है। आप इसे उस विधि के आधार पर रनटाइम में संदर्भित कर सकते हैं, जिसे आप चाहते हैं कि बटन टाइप करें।

उदाहरण के लिए आप लिनक्स रंगरूप के साथ बटन चाहते हैं:

ButtonCreationFactory myFactory = new LinuxButtonCreationFactory(); 
Button button1 = myFactory.createButton(...); 

या यदि आप Windows बटन

ButtonCreationFactory myFactory = new WindowsButtonCreationFactory(); 
Button button1 = myFactory.createButton(...); 

वास्तव में इस मामले में, यह रणनीति पैटर्न का एक प्रकार में जो परिणाम चाहते हैं, चूंकि यह कुछ सृजन करने के लिए एल्गोरिदम को अलग करता है। हालांकि, यह अर्थात् इससे अलग है क्योंकि इसका उपयोग परिचालन एल्गोरिदम की बजाय ऑब्जेक्ट निर्माण के लिए किया जाता है। इसलिए, मूल रूप से अमूर्त कारखाने के साथ आप विभिन्न रणनीतियों का उपयोग करके ऑब्जेक्ट सृजन करते हैं, जो इसे रणनीति पैटर्न के समान बनाता है। हालांकि सार कारखाना रचनात्मक है, जबकि रणनीति पैटर्न परिचालन है। कार्यान्वयन के अनुसार, वे वही परिणाम होते हैं।

0

फैक्टरी पैटर्न एक रचनात्मक पैटर्न है, जो निर्दिष्ट गुणों (व्यवहार) के साथ बनाया गया है। जबकि सृजन के बाद रन समय पर आप इसकी संपत्तियों (व्यवहार) को नहीं बदल सकते हैं। इसलिए यदि आपको विभिन्न गुणों (व्यवहार) की आवश्यकता है तो आपको वस्तु को हटाना होगा और आवश्यक गुणों (व्यवहार) के साथ नई वस्तु बनाना होगा। जो गड़बड़ नहीं है। जबकि रणनीति पैटर्न के मामले में आप रन टाइम पर गुण (व्यवहार) बदल सकते हैं।

0

आप कोड या वर्गीकरण को देखकर बस अंतर को समझ नहीं सकते हैं।गोफ पैटर्न को सही ढंग से समझने के लिए, उनके इरादों को समझने के लिए:

रणनीति: "एल्गोरिदम के परिवार को परिभाषित करें, प्रत्येक को समाहित करें, और उन्हें एक-दूसरे के साथ बदल दें। रणनीति से एल्गोरिदम स्वतंत्र रूप से उन ग्राहकों से भिन्न होता है जो इसका उपयोग करते हैं।"

फैक्टरी विधि: "ऑब्जेक्ट बनाने के लिए एक इंटरफ़ेस परिभाषित करें, लेकिन उप-वर्गों को यह तय करने दें कि कौन सी कक्षा को तुरंत चालू किया जाए। फैक्टरी विधि क्लास को सबक्लास को स्थगित करने देता है।" Difference between Factory Method and Strategy design patterns सरल शब्दों में

2

रणनीति पैटर्न व्यवहार के क्रम निर्माण जहां लागू करने वर्ग के साथ चिंतित नहीं हैं की अधिक है:

और यहाँ उद्देश्य और इन दो पैटर्न के बीच मतभेदों के बारे में एक विस्तृत व्याख्या दी गई है। दूसरी तरफ फैक्ट्री रनटाइम कंक्रीट क्लास इंस्टेंस का निर्माण करती है और कार्यान्वित इंटरफ़ेस द्वारा प्रकट किसी भी व्यवहार (विधि) का उपयोग करने के लिए आप पर निर्भर है।

3

फैक्टरी (और FactoryMethod फैक्टरी द्वारा दिया):

  1. क्रिएशनल पैटर्न
  2. विरासत के आधार पर
  3. फैक्टरी रिटर्न एक फैक्टरी विधि (इंटरफेस) है जो बदले में कंक्रीट वस्तु रिटर्न
  4. आप इंटरफ़ेस और क्लाइंट (कॉलर) के लिए नए कंक्रीट ऑब्जेक्ट्स को प्रतिस्थापित कर सकते हैं सभी ठोस कार्यान्वयन के बारे में अवगत नहीं होना चाहिए
  5. Cl ient हमेशा फैक्टरी विधि में केवल इंटरफ़ेस का उपयोग और आप को छुपा सकते हैं ऑब्जेक्ट निर्माण विवरण

इस wikipedia article और javarevisited article

रणनीति पैटर्न पर एक नज़र डालें:

  1. यह एक व्यवहार पैटर्न
  2. है
  3. यह प्रतिनिधिमंडल पर आधारित है
  4. यह मुझे संशोधित करके ऑब्जेक्ट की हिम्मत बदलता है Thod व्यवहार
  5. यह एल्गोरिदम के परिवार के बीच स्विच करने के लिए इस्तेमाल कर रहा है
  6. यह रन टाइम पर वस्तु के व्यवहार में परिवर्तन

उदाहरण:

आप किसी विशेष आइटम के लिए डिस्काउंट रणनीति कॉन्फ़िगर कर सकते हैं (विमान किराया टिकट या शॉपिंग कार्ट आइटम)। इस उदाहरण में, आप जुलाई-दिसंबर के दौरान किसी आइटम को 25% छूट और जौनरी - जून के दौरान आइटम पर कोई छूट नहीं देंगे।

संबंधित पोस्ट:

Real World Example of the Strategy Pattern

Design Patterns: Factory vs Factory method vs Abstract Factory

संबंधित मुद्दे