फ़ैक्टरी और एब्सट्रैक्ट फ़ैक्टरी पैटर्न के बीच बुनियादी अंतर क्या है?
createThing()
) और एब्सट्रैक्ट फैक्ट्री कंपोजिशन (इनडायरेक्शन क्षैतिज है जैसे getFactory().createThing()
) का उपयोग करता है
फ़ैक्टरी और एब्सट्रैक्ट फ़ैक्टरी पैटर्न के बीच बुनियादी अंतर क्या है?
createThing()
) और एब्सट्रैक्ट फैक्ट्री कंपोजिशन (इनडायरेक्शन क्षैतिज है जैसे getFactory().createThing()
) का उपयोग करता है
जवाबों:
फैक्टरी पैटर्न के साथ, आप (कार्यान्वयन के उदाहरण का उत्पादन Apple
, Banana
, Cherry
, कहते हैं - एक विशेष इंटरफ़ेस के, आदि) IFruit
।
एब्सट्रैक्ट फैक्ट्री पैटर्न के साथ, आप किसी को भी अपनी फैक्ट्री प्रदान करने का एक तरीका प्रदान करते हैं। यह आपके गोदाम को फल या रस के बारे में कुछ भी जानने के लिए आपके गोदाम की आवश्यकता के बिना IFruitFactory
या तो एक या एक होने की अनुमति देता है IJuiceFactory
।
IFruit
- यह उन चीजों को तुरंत लागू करता है जो लागू करते हैं IFruit
। बेशक, यह उन चीजों के उदाहरणों का उत्पादन करने की आवश्यकता नहीं है जो एक विशेष इंटरफ़ेस को लागू करते हैं, लेकिन यह शायद एक कोड गंध है यदि आपके पास एक कारखाना है जो उन चीजों का उत्पादन करता है जो एक दूसरे से पूरी तरह से असंबंधित हैं।
इस जानकारी के लिए स्रोत: http://java.dzone.com/news/intro-design-patterns-abstract
एक सार कारखाने के तरीकों को कारखाने के तरीकों के रूप में लागू किया जाता है। एब्सट्रैक्ट फैक्ट्री पैटर्न और फैक्ट्री मेथड पैटर्न दोनों ही अमूर्त प्रकारों और कारखानों के माध्यम से वास्तविक क्रियान्वयन वर्गों से ग्राहक प्रणाली को डिकॉय करते हैं। फैक्ट्री मेथड इनहेरिटेंस के माध्यम से ऑब्जेक्ट बनाता है जहां एब्सट्रैक्ट फ़ैक्टरी रचना के माध्यम से ऑब्जेक्ट बनाता है।
एब्सट्रैक्ट फैक्ट्री पैटर्न में एब्सट्रैक्ट, कंक्रीटफैक्टरी, एब्सट्रैक्टप्रोडक्ट, कंक्रीटप्रोडक्ट और क्लाइंट होते हैं।
एब्सट्रैक्ट फ़ैक्टरी पैटर्न को फ़ैक्टरी विधि पैटर्न, प्रोटोटाइप पैटर्न या सिंगलटन पैटर्न का उपयोग करके लागू किया जा सकता है। कंक्रीटफैक्टिव ऑब्जेक्ट को सिंगलटन के रूप में लागू किया जा सकता है क्योंकि कंक्रीटफैक्टिव ऑब्जेक्ट की केवल एक आवृत्ति की आवश्यकता है।
फैक्ट्री मेथड पैटर्न एब्सट्रैक्ट फैक्ट्री पैटर्न का सरलीकृत संस्करण है। फैक्ट्री मेथड पैटर्न उन उत्पादों को बनाने के लिए जिम्मेदार है जो एक परिवार से संबंधित हैं, जबकि एब्सट्रैक्ट फैक्ट्री पैटर्न उत्पादों के कई परिवारों से संबंधित है।
फैक्ट्री विधि जनरेटर वर्ग और परिणामी उत्पादों से ग्राहक को अलग करने के लिए इंटरफेस और अमूर्त कक्षाओं का उपयोग करती है। एब्सट्रैक्ट फैक्ट्री में एक जनरेटर होता है जो कई फैक्ट्री विधियों के लिए एक कंटेनर होता है, साथ ही जेनरेटर और उत्पादों से क्लाइंट को डिकॉय करने वाले इंटरफेस के साथ।
फैक्ट्री मेथड पैटर्न का उपयोग करें जब किसी विशेष उत्पाद से क्लाइंट को डिकम्प्लस करने की आवश्यकता होती है जो इसका उपयोग करता है। किसी उत्पाद के इंस्टेंस को बनाने और कॉन्फ़िगर करने के लिए ज़िम्मेदारी के एक ग्राहक को राहत देने के लिए फ़ैक्टरी विधि का उपयोग करें।
एब्सट्रैक्ट फ़ैक्टरी पैटर्न का उपयोग करें जब क्लाइंट को उत्पाद वर्गों से हटा दिया जाना चाहिए। कार्यक्रम विन्यास और संशोधन के लिए विशेष रूप से उपयोगी है। एब्सट्रैक्ट फैक्ट्री पैटर्न उन बाधाओं को भी लागू कर सकता है जिनके बारे में दूसरों के साथ इस्तेमाल किया जाना चाहिए। नए कंक्रीट कारखाने बनाने के लिए यह बहुत काम हो सकता है।
पास्ता निर्माता में पास्ता के विभिन्न प्रकार तैयार करने के लिए डिस्क के लिए यह विनिर्देश एब्सट्रैक्ट फ़ैक्ट्री है, और प्रत्येक विशिष्ट डिस्क एक फ़ैक्ट्री है। सभी फैक्ट्रीज (पास्ता मेकर डिस्क) अमूर्त फैक्ट्री से उनके गुणों को प्राप्त करती हैं। प्रत्येक व्यक्तिगत डिस्क में पास्ता बनाने के तरीके की जानकारी होती है, और पास्ता मेकर नहीं होता है।
मुद्रांकन उपकरण सार फैक्ट्री से मेल खाती है, क्योंकि यह ऑपरेशन के लिए एक इंटरफ़ेस है जो अमूर्त उत्पाद ऑब्जेक्ट बनाता है। मर जाता है कंक्रीट फैक्ट्री के लिए, क्योंकि वे एक ठोस उत्पाद बनाते हैं। प्रत्येक भाग श्रेणी (हूड, डोर, आदि) अमूर्त उत्पाद से मेल खाती है। विशिष्ट भागों (यानी, 99 कैमरी के लिए ड्राइवर साइड डोर) कंक्रीट उत्पादों से मेल खाती है।
खिलौना कंपनी निर्माता से मेल खाती है, क्योंकि यह उत्पाद वस्तुओं को बनाने के लिए कारखाने का उपयोग कर सकती है। खिलौना कंपनी का विभाजन जो एक विशिष्ट प्रकार के खिलौने (घोड़े या कार) का निर्माण करता है जो कि कंक्रीटक्रेटर से मेल खाता है।
फैक्टरी पैटर्न: कारखाना आईपी-कार्यान्वयन का उत्पादन करता है
एब्सट्रैक्ट फैक्ट्री पैटर्न: एक फैक्ट्री-फैक्ट्री इफ़ेक्ट्रीज़ का उत्पादन करती है, जो बदले में आईपोड्र्स का उत्पादन करती है :)
[टिप्पणियों के अनुसार अपडेट करें]
जो मैंने पहले लिखा था वह कम से कम विकिपीडिया के अनुसार सही नहीं है । एक अमूर्त कारखाना बस एक कारखाना इंटरफ़ेस है। इसके साथ, आप अपने कारखानों को रनटाइम पर स्विच कर सकते हैं, विभिन्न कारखानों को विभिन्न संदर्भों में अनुमति दे सकते हैं। उदाहरण विभिन्न OS'es, SQL प्रदाताओं, मिडलवेयर-ड्राइवरों आदि के लिए अलग-अलग कारखाने हो सकते हैं।
संबंधित या आश्रित वस्तुओं के परिवारों को उनके ठोस वर्गों को निर्दिष्ट किए बिना बनाने के लिए एक इंटरफ़ेस प्रदान करें।
एब्सट्रैक्ट फ़ैक्टरी पैटर्न फ़ैक्ट्री मेथड पैटर्न से बहुत मिलता-जुलता है। दोनों के बीच एक अंतर यह है कि एब्सट्रैक्ट फैक्ट्री पैटर्न के साथ, एक वर्ग रचना के माध्यम से किसी वस्तु को वस्तु तात्कालिकता की जिम्मेदारी सौंपता है जबकि फैक्ट्री मेथड पैटर्न वंशानुक्रम का उपयोग करता है और वांछित वस्तु तात्कालिकता को संभालने के लिए एक उपवर्ग पर निर्भर करता है।
दरअसल, प्रत्यायोजित वस्तु अक्सर तात्कालिकता प्रदर्शन करने के लिए कारखाने के तरीकों का उपयोग करती है!
फैक्टरी पैटर्न रचनात्मक पैटर्न के उदाहरण हैं
सृजनात्मक प्रतिमान वस्तु तात्कालिकता प्रक्रिया को अमूर्त करते हैं। वे छिपाते हैं कि वस्तुओं को कैसे बनाया जाता है और समग्र प्रणाली को स्वतंत्र बनाने में मदद करता है कि इसकी वस्तुएं कैसे बनाई और बनाई जाती हैं।
क्लास क्रिएशनल पैटर्न ऑब्जेक्ट को तत्काल फैक्टरी विधि तय करने के लिए वंशानुक्रम के उपयोग पर ध्यान केंद्रित करते हैं
ऑब्जेक्ट क्रिएशनल पैटर्न एक और ऑब्जेक्ट एब्सट्रैक्ट फैक्ट्री के लिए तात्कालिकता के प्रतिनिधिमंडल पर ध्यान केंद्रित करता है
संदर्भ: फैक्टरी बनाम सार कारखाना
फैक्ट्री विधि: आपके पास एक फैक्ट्री है जो एक विशेष बेस क्लास से प्राप्त होने वाली वस्तुओं का निर्माण करती है
सार कारखाना: आपके पास एक कारखाना है जो अन्य कारखानों का निर्माण करता है , और ये कारखाने आधार कक्षाओं से प्राप्त वस्तुओं को बनाते हैं। आप ऐसा इसलिए करते हैं क्योंकि आप अक्सर केवल एक ऑब्जेक्ट (फ़ैक्टरी विधि के साथ) नहीं बनाना चाहते हैं - बल्कि, आप संबंधित ऑब्जेक्ट्स का एक संग्रह बनाना चाहते हैं।
सार फैक्ट्री संबंधित वस्तुओं को बनाने के लिए एक इंटरफ़ेस है लेकिन फ़ैक्टरी विधि एक विधि है। सार कारखाना कारखाना विधि द्वारा कार्यान्वित किया जाता है।
मूल अंतर:
फैक्टरी: ग्राहक के लिए तात्कालिकता तर्क को उजागर किए बिना वस्तुओं को बनाता है।
फैक्ट्री मेथड : किसी ऑब्जेक्ट को बनाने के लिए एक इंटरफेस को परिभाषित करें, लेकिन उपवर्गों को यह तय करने दें कि कौन सी क्लास को तत्काल करना है। फैक्टरी विधि उपवर्गों के लिए एक वर्ग आक्षेप को स्थगित करने देती है
सार फैक्टरी : संबंधित या आश्रित वस्तुओं के परिवारों को उनके ठोस वर्गों को निर्दिष्ट किए बिना बनाने के लिए एक इंटरफ़ेस प्रदान करता है।
एब्सट्रैक्ट पैटर्न किसी अन्य वर्ग को ऑब्जेक्ट बनाने की जिम्मेदारी सौंपने के लिए कंपोजीशन का उपयोग करता है जबकि फैक्ट्री विधि पैटर्न इनहेरिटेंस का उपयोग करता है और ऑब्जेक्ट बनाने के लिए व्युत्पन्न वर्ग या उप वर्ग पर निर्भर करता है
से oodesign लेख:
फैक्टरी वर्ग आरेख:
उदाहरण: स्थैतिक
public class ShapeFactory {
//use getShape method to get object of type shape
public static Shape getShape(String shapeType){
if(shapeType == null){
return null;
}
if(shapeType.equalsIgnoreCase("CIRCLE")){
return new Circle();
} else if(shapeType.equalsIgnoreCase("RECTANGLE")){
return new Rectangle();
} else if(shapeType.equalsIgnoreCase("SQUARE")){
return new Square();
}
return null;
}
}
गैर-स्टेटिक फैक्ट्री को लागू करने वाले FactoryMethod उदाहरण इस पोस्ट में उपलब्ध है:
डिजाइन पैटर्न: फैक्टरी बनाम फैक्टरी विधि बनाम सार फैक्टरी
कब इस्तेमाल करें: क्लाइंट को बस एक क्लास की जरूरत होती है और उसे इस बात की परवाह नहीं होती है कि उसे कौन सा ठोस कार्यान्वयन मिल रहा है।
फैक्टरी विधि वर्ग digaram:
उपयोग कब करें: क्लाइंट को यह पता नहीं होता है कि रनटाइम के दौरान इसे बनाने के लिए किन ठोस वर्गों की आवश्यकता होगी, लेकिन बस एक वर्ग प्राप्त करना चाहता है जो काम करेगा।
डीज़ोन से एब्सट्रैक्ट फ़ैक्टरी क्लास आरेख
कब उपयोग करें: जब आपके सिस्टम को उत्पादों के कई परिवार बनाने हैं या आप कार्यान्वयन विवरणों को उजागर किए बिना उत्पादों का एक पुस्तकालय प्रदान करना चाहते हैं।
उपरोक्त लेखों में स्रोत कोड उदाहरण अवधारणाओं को स्पष्ट रूप से समझने के लिए बहुत अच्छे हैं।
कोड उदाहरण के साथ संबंधित एसई प्रश्न:
फैक्टरी पैटर्न। कारखाने के तरीकों का उपयोग कब करें?
अंतर:
अन्य उपयोगी लेख:
sourcemaking से factory_method
abstract_factory sourcemaking से
सार-कारखाने में डिजाइन पैटर्न journaldev से
उदाहरण / सार फैक्ट्री के लिए परिदृश्य
मैं एक ऐसी जगह पर रहता हूं, जहां बारिश के मौसम में बारिश होती है, सर्दियों में स्नो और गर्मियां और गर्मियों में धूप। मुझे खुद को तत्वों से बचाने के लिए विभिन्न प्रकार के कपड़े चाहिए। ऐसा करने के लिए मैं अपने घर के पास की दुकान पर जाता हूं और अपनी रक्षा के लिए कपड़े / सामान मांगता हूं। स्टोर कीपर मुझे अपनी जेब के वातावरण और गहराई के अनुसार उपयुक्त वस्तु देता है। मेरे द्वारा दी गई वस्तुएं गुणवत्ता और मूल्य सीमा के समान स्तर की हैं। चूंकि वह मेरे मानकों से अवगत है, इसलिए ऐसा करना उसके लिए आसान है। लेकिन जब सड़क पर एक अमीर आदमी समान आवश्यकताओं के साथ आता है तो उसे एक महंगी, ब्रांडेड वस्तु मिलती है। एक ध्यान देने योग्य बात यह है कि मेरे द्वारा दी जाने वाली सभी वस्तुएं गुणवत्ता, मानक और लागत में एक दूसरे के पूरक हैं। एक कह सकते हैं कि वे एक दूसरे के साथ जाते हैं। इस अमीर आदमी को मिलने वाली वस्तुओं के साथ भी ऐसा ही है।
इसलिए उपरोक्त परिदृश्य को देखकर, मैं अब दुकान कीपर की दक्षता की सराहना करता हूं। मैं इस दुकानदार को अमूर्त दुकान से बदल सकता हूं। आइटम जो हमें अमूर्त वस्तुओं और मुझे और परिप्रेक्ष्य ग्राहकों के रूप में समृद्ध के साथ मिलते हैं। हम सभी की जरूरत है उत्पाद / आइटम है जो हमारी आवश्यकताओं के अनुरूप है।
अब मैं आसानी से एक ऑनलाइन स्टोर पर विचार कर सकता हूं जो अपने कई ग्राहकों को सेवाएं प्रदान करता है। प्रत्येक ग्राहक तीन समूहों में से एक से संबंधित है। जब एक प्रीमियम समूह उपयोगकर्ता साइट खोलता है तो उसे बढ़िया यूआई, अत्यधिक अनुकूलित विज्ञापन फलक, मेनू में अधिक विकल्प आदि मिलते हैं। इन्हीं सुविधाओं के सेट को गोल्ड उपयोगकर्ता के लिए प्रस्तुत किया जाता है, लेकिन मेनू में कार्यक्षमता कम होती है, विज्ञापन अधिकतर रीलेवेंट होते हैं, और थोड़े कम अहंकारी यूआई। लास्ट मेरी तरह का यूजर है, एक 'फ्री ग्रुप' यूजर है। मुझे बस इतना परोसा जाता है कि मुझे बुरा न लगे। यूआई एक नंगे न्यूनतम है, विज्ञापन इस तरह से ट्रैक किए जाते हैं कि मुझे नहीं पता कि इसमें क्या आता है, आखिरकार मेनू को लॉग आउट किया गया है।
अगर मुझे इस वेबसाइट की तरह कुछ बनाने का मौका मिला तो मैं निश्चित रूप से एब्सट्रैक्ट फैक्ट्री पैटर्न पर विचार करूंगा।
सार उत्पाद: विज्ञापन फलक, मेनू, UI चित्रकार।
एब्सट्रैक्ट फैक्ट्री: वेब स्टोर यूजर एक्सपीरियंस
कंसीलर फैक्ट्री: प्रीमियम यूजर एक्सपीरियंस, गोल्ड यूजर एक्सपीरियंस, जनरल यूजर एक्सपीरियंस।
कई लोगों को शायद आश्चर्य होगा, लेकिन यह सवाल गलत है । यदि आप एक साक्षात्कार के दौरान यह प्रश्न सुनते हैं, तो आपको साक्षात्कारकर्ता को यह समझने में मदद करने की आवश्यकता है कि भ्रम कहां है।
आइए इस तथ्य से शुरू करें कि कोई ठोस पैटर्न नहीं है जिसे सिर्फ "फैक्टरी" कहा जाता है। पैटर्न है जिसे "एब्सट्रैक्ट फैक्ट्री" कहा जाता है, और एक पैटर्न है जिसे "फ़ैक्टरी विधि" कहा जाता है।
तो, "फैक्टरी" का क्या मतलब है? निम्नलिखित में से एक (संदर्भ के दायरे के आधार पर सभी को सही माना जा सकता है):
और, दुर्भाग्य से , कई लोग "फैक्टरी" का उपयोग दूसरे प्रकार के कारखाने को निरूपित करने के लिए करते हैं, जो कारखाने या कारखानों (या उनके इंटरफेस) का निर्माण करता है। उनके सिद्धांत के आधार पर:
उत्पाद लागू करता है IProduct, जिसे फैक्ट्री द्वारा बनाया गया है, जो IFactory को लागू करता है, जो AbstractFactory द्वारा बनाया गया है।
यह समझने के लिए कि यह कितना मूर्खतापूर्ण है, चलो अपना समीकरण जारी रखें:
एसेन्सेफ्ट इम्प्लीमेंट्स IAbstractFactory, जो कि द्वारा बनाया गया है ... AbstractAbstractFactory ???
मुझे आशा है कि आप इस बिंदु को देखेंगे। भ्रमित मत हो, और कृपया उन चीजों का आविष्कार न करें जो कारण के लिए मौजूद नहीं हैं।
-
पुनश्च : उत्पादों के लिए फैक्ट्री एब्सट्रैक्ट फैक्ट्री है, और एब्सट्रैक्ट फैक्ट्रीज के लिए फैक्ट्री एसेंसफैक्ट्री का एक और उदाहरण है।
//Abstract factory - Provides interface to create factory of related products
interface PizzaIngredientsFactory{
public Dough createDough(); //Will return you family of Dough
public Clam createClam(); //Will return you family of Clam
public Sauce createSauce(); //Will return you family of Sauce
}
class NYPizzaIngredientsFactory implements PizzaIngredientsFactory{
@Override
public Dough createDough(){
//create the concrete dough instance that NY uses
return doughInstance;
}
//override other methods
}
पाठ्य पुस्तक की परिभाषाएं पहले से ही अन्य उत्तरों द्वारा प्रदान की जाती हैं। मैंने सोचा कि मैं इसका एक उदाहरण भी दूंगा।
तो यहाँ PizzaIngredientsFactory
एक सार कारखाना है क्योंकि यह संबंधित उत्पादों के परिवार बनाने के लिए तरीके प्रदान करता है।
ध्यान दें कि सार कारखाने में प्रत्येक विधि अपने आप में एक कारखाना विधि है। जैसे createDough()
अपने आप में एक कारखाना विधि है जिसका ठोस कार्यान्वयन उपवर्गों द्वारा प्रदान किया जाएगा NYPizzaIngredientsFactory
। इसलिए इसका उपयोग करके प्रत्येक भिन्न स्थान कंक्रीट अवयवों के उदाहरण बना सकते हैं जो उनके स्थान से संबंधित हैं।
ठोस कार्यान्वयन का उदाहरण देता है
उदाहरण में:
- createDough()
- आटा के लिए ठोस कार्यान्वयन प्रदान करता है। तो यह एक फैक्ट्री विधि है
संबंधित वस्तुओं के परिवार बनाने के लिए इंटरफ़ेस प्रदान करता है
उदाहरण में:
- PizzaIngredientsFactory
एक सार कारखाने के रूप में यह वस्तुओं की तरह एक संबंधित सेट बनाने के लिए अनुमति देता है Dough
, Clams
, Sauce
। वस्तुओं के प्रत्येक परिवार को बनाने के लिए यह एक कारखाना विधि प्रदान करता है।
हेड फर्स्ट डिज़ाइन पैटर्न से उदाहरण
मेरे पास जॉन के जवाब के साथ योगदान करने के लिए कुछ बिंदु हैं:
"फ़ैक्टरी विधि" (क्योंकि सिर्फ "फ़ैक्टरी" अस्पष्ट है) के साथ, आप एक विशेष इंटरफ़ेस के कार्यान्वयन ( Lemon
और Orange
, आदि) का उत्पादन करते हैं - कहते हैं IFruit
,। यह कारखाना कहा जा सकता है CitricFruitFactory
।
लेकिन अब आप एक और प्रकार का फल बनाना चाहते हैं जो CitricFruitFactory नहीं बना पा रहा है। हो सकता है कि CitricFruitFactory
यदि आप Strawberry
इसे बनाते हैं (स्ट्रॉबेरी एक साइट्रिक फल नहीं है!) तो कोड का कोई मतलब नहीं होगा ।
तो आप एक नई फैक्ट्री बना सकते हैं , RedFruitFactory
जिसका निर्माण होता है , आदि।Strawberry
Raspberry
जैसे जॉन फेमिनेला ने कहा:
"एब्सट्रैक्ट फैक्ट्री पैटर्न के साथ, आप एक विशेष फैक्ट्री इंटरफ़ेस के कार्यान्वयन का उत्पादन करते हैं - उदाहरण के लिए, IFruitFactory
उनमें से प्रत्येक को पता है कि विभिन्न प्रकार के फल कैसे बनाए जाते हैं।"
की implementatios यही IFruitFactory
कर रहे हैं CitricFruitFactory
और RedFruitFactory
!
मेरे स्रोत हैं: StackOverflow
, tutorialspoint.com
, programmers.stackexchange.com
और CodeProject.com
।
Factory Method
(यह भी कहा जाता है Factory
) एक Interface
कार्यान्वयन के डिकॉउल क्लाइंट के लिए है। नमूना के लिए हमारे पास Shape
दो Circle
और Square
कार्यान्वयन के साथ एक इंटरफ़ेस है। हमने एक फैक्ट्री विधि के साथ एक फैक्ट्री विधि को परिभाषित किया है जैसे कि एक निर्धारक पैरामीटर Type
और Shape
इंटरफ़ेस के नए संबंधित कार्यान्वयन के साथ ।
Abstract Factory
कई फ़ैक्टरी विधियों या कई फ़ैक्टरी कार्यान्वयन द्वारा फ़ैक्टरी इंटरफ़ेस होता है। अगले उपरोक्त नमूने के लिए हमारे पास Color
दो Red
और Yellow
कार्यान्वयन के साथ एक इंटरफ़ेस है। हमने ShapeColorFactory
दो RedCircleFactory
और के साथ एक इंटरफ़ेस परिभाषित किया है YellowSquareFactory
। इस अवधारणा को समझाने के लिए निम्नलिखित कोड:
interface ShapeColorFactory
{
public Shape getShape();
public Color getColor();
}
class RedCircleFactory implements ShapeColorFactory
{
@Override
public Shape getShape() {
return new Circle();
}
@Override
public Color getColor() {
return new Red();
}
}
class YellowSquareFactory implements ShapeColorFactory
{
@Override
public Shape getShape() {
return new Square();
}
@Override
public Color getColor() {
return new Yellow();
}
}
यहाँ FactoryMethod
और के बीच अंतर AbstractFactory
। Factory Method
के रूप में बस एक अंतरफलक के एक ठोस वर्ग पर Abstract Factory
लौटने के रूप में factory of factory
। दूसरे शब्दों Abstract Factory
में इंटरफ़ेस की एक श्रृंखला के विभिन्न संयोजन लौटाते हैं।
मुझे आशा है कि मेरी व्याख्या उपयोगी है।
उन कारखानों में मुख्य अंतर यह है कि आप कारखानों के साथ क्या करना चाहते हैं और जब आप इसका उपयोग करना चाहते हैं।
कभी-कभी, जब आप IOC कर रहे होते हैं (नियंत्रण का उल्टा जैसे कंस्ट्रक्टर इंजेक्शन), तो आप जानते हैं कि आप ठोस ऑब्जेक्ट बना सकते हैं। जैसा कि फलों के ऊपर उदाहरण में बताया गया है, यदि आप फलों की वस्तुओं को बनाने के लिए तैयार हैं, तो आप साधारण फैक्ट्री पैटर्न का उपयोग कर सकते हैं ।
लेकिन कई बार, आप ठोस वस्तुओं का निर्माण नहीं करना चाहते हैं, वे बाद में कार्यक्रम के प्रवाह में आएंगे। लेकिन कॉन्फ़िगरेशन आपको बताता है कि आप किस तरह का कारखाना शुरू में उपयोग करना चाहते हैं, वस्तुओं को बनाने के बजाय, आप उन कारखानों पर गुजर सकते हैं जो एक सामान्य कारखाने वर्ग से आईओसी में निर्माणकर्ता तक प्राप्त होते हैं।
इसलिए, मुझे लगता है कि इसका उद्देश्य जीवनकाल और निर्माण के बारे में भी है।
दोनों Factory Method
और Abstract Factory
ग्राहकों को कंक्रीट के प्रकारों से विमुख रखते हैं। दोनों वस्तुओं का निर्माण करते हैं, लेकिन Factory
विधि Abstract Factory
संरचना का उपयोग करते समय वंशानुक्रम का उपयोग करती है।
Factory Method
ठोस वस्तुओं (उत्पाद) बनाने के लिए उपवर्गों में विरासत में मिला है, जबकि Abstract Factory
संबंधित उत्पादों और इन इंटरफेस के उपवर्ग के परिवार बनाने के लिए इंटरफेस प्रदान संबंधित उत्पादों को बनाने के लिए कैसे परिभाषित करते हैं।
फिर इन उपवर्गों को जब तात्कालिक रूप से उत्पाद वर्गों में पारित किया जाता है, जहां इसे अमूर्त प्रकार के रूप में उपयोग किया जाता है। में संबंधित उत्पादों का Abstract Factory
उपयोग कर अक्सर लागू किया जाता है Factory Method
।
जॉन फेमिनाला जवाब का विस्तार:
Apple
, Banana
, Cherry
औजार FruitFactory
और कहा कि एक विधि कहा जाता है Create
जो एप्पल या केले या चेरी बनाने की पूरी तरह जिम्मेदार है। आप अपनी Factory
विधि से काम कर रहे हैं।
अब, आप Create
अपने फलों में से एक विशेष सलाद चाहते हैं और वहां आपका एब्सट्रैक्ट फैक्ट्री आता है । एब्सट्रैक्ट फैक्ट्री यह जानती है कि एप्पल, केला और चेरी से अपने विशेष सलाद को कैसे बनाया जाए।
public class Apple implements Fruit, FruitFactory {
public Fruit Create() {
// Apple creation logic goes here
}
}
public class Banana implements Fruit, FruitFactory {
public Fruit Create() {
// Banana creation logic goes here
}
}
public class Cherry implements Fruit, FruitFactory {
public Fruit Create() {
// Cherry creation logic goes here
}
}
public class SpecialSalad implements Salad, SaladFactory {
public static Salad Create(FruitFactory[] fruits) {
// loop through the factory and create the fruits.
// then you're ready to cut and slice your fruits
// to create your special salad.
}
}
परिभाषा के अनुसार हम दो के अंतरों को बाहर निकाल सकते हैं:
फैक्टरी: एक इंटरफ़ेस का उपयोग किसी ऑब्जेक्ट को बनाने के लिए किया जाता है, लेकिन उपवर्ग यह तय करता है कि किस वर्ग को तुरंत दिया जाए। आवश्यकता पड़ने पर वस्तु का निर्माण किया जाता है।
एब्सट्रैक्ट फैक्ट्री: एब्सट्रैक्ट फैक्ट्री पैटर्न एक सुपर-फैक्ट्री के रूप में कार्य करता है जो अन्य फैक्ट्रियों का निर्माण करता है। एब्सट्रैक्ट फैक्ट्री पैटर्न में एक इंटरफ़ेस संबंधित वस्तुओं का एक सेट बनाने के लिए या उनके ठोस वर्गों को निर्दिष्ट किए बिना निर्भर वस्तुओं के लिए जिम्मेदार है।
इसलिए, ऊपर की परिभाषाओं में हम एक विशेष अंतर पर जोर दे सकते हैं। यानी, फैक्ट्री पैटर्न ऑब्जेक्ट बनाने के लिए जिम्मेदार है और एब्सट्रैक्ट फैक्ट्री संबंधित वस्तुओं का एक सेट बनाने के लिए जिम्मेदार है; स्पष्ट रूप से दोनों एक इंटरफेस के माध्यम से।
फैक्टरी पैटर्न:
public interface IFactory{
void VehicleType(string n);
}
public class Scooter : IFactory{
public void VehicleType(string n){
Console.WriteLine("Vehicle type: " + n);
}
}
public class Bike : IFactory{
public void VehicleType(string n) {
Console.WriteLine("Vehicle type: " + n);
}
}
public interface IVehicleFactory{
IFactory GetVehicleType(string Vehicle);
}
public class ConcreteVehicleFactory : IVehicleFactory{
public IFactory GetVehicleType(string Vehicle){
switch (Vehicle){
case "Scooter":
return new Scooter();
case "Bike":
return new Bike();
default:
return new Scooter();
}
}
class Program{
static void Main(string[] args){
IVehicleFactory factory = new ConcreteVehicleFactory();
IFactory scooter = factory.GetVehicleType("Scooter");
scooter.VehicleType("Scooter");
IFactory bike = factory.GetVehicleType("Bike");
bike.VehicleType("Bike");
Console.ReadKey();
}
}
सार फैक्टरी पैटर्न:
interface IVehicleFactory{
IBike GetBike();
IScooter GetScooter();
}
class HondaFactory : IVehicleFactory{
public IBike GetBike(){
return new FZS();
}
public IScooter GetScooter(){
return new FZscooter();
}
}
class HeroFactory: IVehicleFactory{
public IBike GetBike(){
return new Pulsur();
}
public IScooter GetScooter(){
return new PulsurScooter();
}
}
interface IBike
{
string Name();
}
interface IScooter
{
string Name();
}
class FZS:IBike{
public string Name(){
return "FZS";
}
}
class Pulsur:IBike{
public string Name(){
return "Pulsur";
}
}
class FZscooter:IScooter {
public string Name(){
return "FZscooter";
}
}
class PulsurScooter:IScooter{
public string Name(){
return "PulsurScooter";
}
}
enum MANUFACTURERS
{
HONDA,
HERO
}
class VehicleTypeCheck{
IBike bike;
IScooter scooter;
IVehicleFactory factory;
MANUFACTURERS manu;
public VehicleTypeCheck(MANUFACTURERS m){
manu = m;
}
public void CheckProducts()
{
switch (manu){
case MANUFACTURERS.HONDA:
factory = new HondaFactory();
break;
case MANUFACTURERS.HERO:
factory = new HeroFactory();
break;
}
Console.WriteLine("Bike: " + factory.GetBike().Name() + "\nScooter: " + factory.GetScooter().Name());
}
}
class Program
{
static void Main(string[] args)
{
VehicleTypeCheck chk = new VehicleTypeCheck(MANUFACTURERS.HONDA);
chk.CheckProducts();
chk= new VehicleTypeCheck(MANUFACTURERS.HERO);
chk.CheckProducts();
Console.Read();
}
}
यहां देखें: http://www.allapplabs.com/java_design_patterns/abstract_factory_pattern.htm ऐसा लगता है कि फैक्ट्री विधि एक विशेष वर्ग (सार नहीं) को आधार वर्ग के रूप में उपयोग करती है जबकि सार कारखाना इसके लिए एक सार वर्ग का उपयोग करता है। इसके अलावा अगर एब्स्ट्रैक्ट क्लास के बजाय इंटरफेस का उपयोग किया जाए तो परिणाम एब्सट्रैक्ट फैक्ट्री पैटर्न का एक अलग कार्यान्वयन होगा।
: डी
विभिन्न प्रकार के इंटरफेस बनाने के लिए सार फैक्टरी टेम्पलेट है। मान लें कि आपके पास ऐसी परियोजना है जिसके लिए आपको विभिन्न प्रकार की सीएसएसवी फाइलों को पार्स करने की आवश्यकता है, जैसे कि मात्रा, कीमत और आइटम की विशिष्ट जानकारी जैसे कुछ में चॉकलेट के बारे में अन्य फलों के बारे में डेटा होता है और फिर पार्स करने के बाद आपको उनके संबंधित डेटाबेस में इस जानकारी को अपडेट करने की आवश्यकता होती है ताकि अब आपके पास यह हो सके एक एब्सट्रैक्ट फैक्ट्री जो आपको पार्सर और मॉडिफायर फैक्ट्री लौटाती है और फिर यह पार्सर फैक्ट्री आपको चॉकलेट पार्सर ऑब्जेक्ट, फ्रूट पार्सर ऑब्जेक्ट इत्यादि लौटा सकती है और इसी तरह मॉडिफायर फैक्ट्री चॉकलेट मॉडिफायर ऑब्जेक्ट, फ्रूट मॉडिफायर ऑब्जेक्ट आदि लौटा सकती है।
मुझे लगता है कि हम Java8 उदाहरण कोड देखकर इन दोनों के बीच के अंतर को समझ सकते हैं:
interface Something{}
interface OneWhoCanProvideSomething {
Something getSomething();
}
interface OneWhoCanProvideCreatorsOfSomething{
OneWhoCanProvideSomething getCreator();
}
public class AbstractFactoryExample {
public static void main(String[] args) {
//I need something
//Let's create one
Something something = new Something() {};
//Or ask someone (FACTORY pattern)
OneWhoCanProvideSomething oneWhoCanProvideSomethingOfTypeA = () -> null;
OneWhoCanProvideSomething oneWhoCanProvideSomethingOfTypeB = () -> null;
//Or ask someone who knows soemone who can create something (ABSTRACT FACTORY pattern)
OneWhoCanProvideCreatorsOfSomething oneWhoCanProvideCreatorsOfSomething = () -> null;
//Same thing, but you don't need to write you own interfaces
Supplier<Something> supplierOfSomething = () -> null;
Supplier<Supplier<Something>> supplierOfSupplier = () -> null;
}
}
अब सवाल यह है कि निर्माण का कौन सा तरीका आपको उपयोग करना चाहिए और क्यों: पहला तरीका (कोई पैटर्न, सिर्फ सादा कंस्ट्रक्टर): अपने आप से बनाना एक अच्छा विचार नहीं है, आपको सभी काम करना होगा, और आपका क्लाइंट कोड से जुड़ा हुआ है विशेष कार्यान्वयन।
दूसरा तरीका (फ़ैक्टरी पैटर्न का उपयोग करते हुए): आपको वह लाभ प्रदान करता है जिसे आप किसी भी प्रकार के कार्यान्वयन से पारित कर सकते हैं, जो कुछ स्थिति के आधार पर विभिन्न प्रकार की चीज़ों को प्रदान कर सकता है (हो सकता है कि कोई पैरामीटर क्रिएशनल विधि से पारित हो)।
तीसरा तरीका (एब्सट्रैक्ट फैक्ट्री पैटर्न का उपयोग करके): यह आपको अधिक लचीलापन देता है। आप कुछ हालत के आधार पर (शायद एक पैरामीटर पारित) के आधार पर कुछ के विभिन्न प्रकार के रचनाकारों को पा सकते हैं।
ध्यान दें कि आप हमेशा दो स्थितियों को एक साथ जोड़कर फैक्ट्री पैटर्न से दूर हो सकते हैं (जो कोड जटिलता और युग्मन को थोड़ा बढ़ाता है), मुझे लगता है कि हम शायद ही कभी वास्तविक जीवन का उपयोग करते हैं एब्सट्रैक्ट फ़ैक्टरी पैटर्न के मामलों को देखते हैं।