फ़ैक्टरी और रणनीति पैटर्न के बीच अंतर क्या है?


145

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

मेरे लिए दोनों एक अतिरिक्त फैक्ट्री क्लास (जो कि फैक्ट्री पैटर्न में उत्पाद का एक ऑब्जेक्ट बनाते हैं) के अलावा अन्य समान दिख रहे हैं।

जवाबों:


226

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

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


1
`एक रणनीति पैटर्न एक विशेष तरीके से एक ऑपरेशन (या संचालन का सेट) करने के लिए उपयोग किया जाता है` क्या इसका मतलब वस्तुओं पर संचालन है?
ओपीवी

32

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

फैक्टरी पैटर्न आपको ऑब्जेक्ट निर्माण को एनकैप्सुलेट करने की अनुमति देता है।

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


25

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


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

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

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

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

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

इसलिए। यदि आपका कारखाना तरीका तय हो गया है, तो आपके पास ऐसा हो सकता है:

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

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


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

4
वास्तव में इस मामले में, यह एक प्रकार का रणनीति पैटर्न है, लेकिन यह शब्दार्थ से भिन्न होता है क्योंकि इसका उपयोग संचालन के बजाय OBJECT CREATION के लिए किया जाता है। इसलिए, मूल रूप से आपके पास विभिन्न रणनीतियों का उपयोग करके ऑब्जेक्ट निर्माण होता है।
इंटरबॉय

2
@OscarRyz क्या आप दोनों को वर्णित करने वाले कार्यक्रम के साथ अपना जवाब अपडेट कर सकते हैं
प्रकाश पांडे

11

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

उदाहरण के लिए यदि आप लिनक्स लुक और फील वाले बटन चाहते हैं:

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

या यदि आप विंडोज बटन चाहते हैं

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

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


10

फैक्टरी (और FactoryMethod कारखाने द्वारा लौटा) :

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

इस विकिपीडिया लेख और javarevisited लेख पर एक नज़र है

रणनीति पैटर्न:

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

उदाहरण:

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

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

रणनीति पैटर्न का वास्तविक विश्व उदाहरण

डिजाइन पैटर्न: फैक्टरी बनाम फैक्टरी विधि बनाम सार फैक्टरी


3

ऑस्कर ने अपने कोड के संदर्भ में क्या कहा और कैसे बढ़ाया जाए:

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


3

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


2

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

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

फ़ैक्टरी विधि: "ऑब्जेक्ट बनाने के लिए एक इंटरफ़ेस को परिभाषित करें, लेकिन उपवर्गों को यह तय करने दें कि कौन सी क्लास को तात्कालिक बनाना है। फैक्ट्री मेथड एक क्लास को सबक्लासेस को तत्काल स्थगित करने देता है।"

और यहां इन दोनों पैटर्न के बीच अंतर और अंतर के बारे में विस्तृत विवरण दिया गया है: फैक्टरी विधि और रणनीति डिजाइन पैटर्न के बीच अंतर


1

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

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 राज्यों के कारखाने से मूल पैटर्न बाल वर्ग के लिए वस्तु का निर्माण छोड़ देता है। यहां उस फैक्ट्री के साथ जिसे आप पूरी तरह से बदल रहे हैं न कि आप जिस व्यवहार में रुचि रखते हैं। इसके द्वारा आप पूरी प्रणाली की जगह लेंगे एल्गोरिथ्म नहीं।


0

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.