फैक्टरी की मेरी समझ यह है कि यह कंक्रीट कक्षाओं के तत्कालता को समाहित करता है जो सभी एक सामान्य सार वर्ग या इंटरफेस का उत्तराधिकारी है। यह क्लाइंट को कौन सी ठोस कक्षा बनाने के लिए निर्धारित करने की प्रक्रिया से decoupled करने की अनुमति देता है, जिसका मतलब है कि आप क्लाइंट के कोड को बदलने के बिना अपने प्रोग्राम से कंक्रीट कक्षाओं को जोड़ या निकाल सकते हैं। आपको कारखाना बदलना पड़ सकता है, लेकिन कारखाना "उद्देश्य निर्मित" है और वास्तव में केवल बदलने का एक कारण है - एक ठोस वर्ग जोड़ा/हटा दिया गया है।क्या यह इस वर्ग को "फैक्ट्री" कहने में भ्रमित है?
मैंने कुछ कक्षाएं बनाई हैं जो वास्तव में ऑब्जेक्ट इंस्टेंटेशन को समाहित करती हैं लेकिन एक अलग कारण के लिए: ऑब्जेक्ट्स को तुरंत चालू करना कठिन होता है। फिलहाल, मैं इन वर्गों को "कारखानों" कह रहा हूं, लेकिन मुझे चिंता है कि एक गलत नामक हो सकता है और अन्य प्रोग्रामर को भ्रमित कर देगा जो मेरे कोड को देख सकते हैं। मेरा "कारखाना" वर्ग यह तय नहीं करता कि कौन सी ठोस कक्षा को तत्काल स्थापित किया जाए, वे गारंटी देते हैं कि वस्तुओं की एक श्रृंखला सही क्रम में तत्काल हो जाएगी और जब मैं new()
पर कॉल करता हूं तो सही कक्षाएं सही रचनाकारों में पारित की जाएंगी।
उदाहरण के लिए, एक एमवीवीएम प्रोजेक्ट के लिए मैं काम कर रहा हूं, मैंने यह सुनिश्चित करने के लिए एक कक्षा लिखी है कि मेरा SetupView
ठीक से तत्काल हो जाता है।
public class SetupViewFactory
{
public SetupView CreateView(DatabaseModel databaseModel, SettingsModel settingsModel, ViewUtilities viewUtilities)
{
var setupViewModel = new SetupViewModel(databaseModel, settingsModel, viewUtilities);
var setupView = new SetupView();
setupView.DataContext = setupViewModel;
return setupView;
}
}
यह है कि यह एक "फैक्टरी" कॉल करने के लिए भ्रामक है: यह इस तरह दिखता है? यह कई संभावित ठोस कक्षाओं में से एक तय नहीं करता है, और इसका रिटर्न प्रकार इंटरफ़ेस या सार प्रकार नहीं है, लेकिन यह ऑब्जेक्ट इंस्टेंटेशन को समाहित करता है।
यदि यह "कारखाना" नहीं है, तो यह क्या है?
संपादित
लोगों ने सुझाव दिया है कि यह वास्तव में बिल्डर पैटर्न है।
dofactory से बिल्डर पैटर्न की परिभाषा इस प्रकार है:
अलग अपने प्रतिनिधित्व से एक जटिल वस्तु के निर्माण के लिए इतना है कि एक ही निर्माण की प्रक्रिया अलग अभ्यावेदन बना सकते हैं।
यह एक खिंचाव की थोड़ी सी भी दिखता है। जो चीज मुझे परेशान करती है वह "अलग-अलग प्रतिनिधित्व" है। मेरा उद्देश्य एक दृश्य बनाने की प्रक्रिया को सारणी नहीं देना है (यह नहीं कि यह एक योग्य लक्ष्य नहीं है)। मैं बस एक स्थान पर एक विशिष्ट दृश्य बनाने के लिए तर्क डालने की कोशिश कर रहा हूं, ताकि यदि कोई भी सामग्री या उस दृश्य को बदलने की प्रक्रिया में परिवर्तन हो, तो मुझे केवल एक वर्ग को बदलना होगा। बिल्डर पैटर्न वास्तव में कह रहा है, "आइए दृश्य बनाने के लिए एक सामान्य प्रक्रिया बनाएं, फिर आप जो भी दृश्य बनाते हैं, उसके लिए आप उसी मूल प्रक्रिया का पालन कर सकते हैं।" अच्छा है, लेकिन यह वही नहीं है जो मैं यहां कर रहा हूं।
संपादित 2
मैं सिर्फ एक Wikipedia article on Dependency Injection में एक दिलचस्प उदाहरण मिल गया।
public class CarFactory {
public static Car buildCar() {
return new Car(new SimpleEngine());
}
}
यह लगभग बिल्कुल उपयोग मेरे पास है (और, नहीं, मैं विकी लेख :) नहीं लिखा था) है:
के तहत "मैन्युअल रूप से इंजेक्शन निर्भरता", यह निम्नलिखित वर्ग शामिल हैं।
दिलचस्प है, इस लिए इस कोड निम्नलिखित टिप्पणी है:
उपरोक्त कोड में, कारखाने कार कोडांतरण की जिम्मेदारी लेता है, और कार में इंजन injects। यह कार को इंजन बनाने के बारे में जानने से मुक्त करता है, हालांकि अब कारफैक्टरी को इंजन के निर्माण के बारे में जानना है। कोई एक इंजन फैक्ट्री बना सकता है, लेकिन यह केवल कारखानों के बीच निर्भरता बनाता है। तो समस्या बनी हुई है, लेकिन कम से कम कारखानों, या निर्माता ऑब्जेक्ट्स में स्थानांतरित कर दिया गया है। [मेरे जोर]
तो, यह मुझसे कहता है कि कम से कम मैं केवल एक है जो एक वर्ग एक और वर्ग में सामान इंजेक्शन लगाने के साथ मदद करने के लिए बनाने के बारे में सोचा है नहीं कर रहा हूँ, और मेरे अलावा कोई और नहीं कर रहा हूँ का प्रयास किया इस वर्ग को एक कारखाने का नाम देने के लिए।
नाइटपीकी न होने के लिए, लेकिन आप अपनी विधि का नाम बदल सकते हैं या तो बनाएं, या CreateSetupView। – Mathias
यदि यह सब करने की आपकी कोशिश है तो यह वास्तव में पैटर्न में से कोई भी नहीं है, बस कुछ शीर्ष स्तर की कक्षा में सब कुछ नया करें। यह एक कारखाना हाँ कहना गलत है। – Chap
उदाहरण कन्स्ट्रक्टर पैटर्न की तरह लगता है। –