यह मेरे अन्य प्रश्नों में से एक जैसा है, लेकिन मुझे लगता है कि एक नया सवाल वारंट करने के लिए काफी अलग है।अमूर्त कारखानों और इंजेक्शन के बारे में प्रश्न
मूल रूप से मैं एक उपयोगकर्ता इंटरफ़ेस लिख रहा हूं, और मेरे उपयोगकर्ता इंटरफ़ेस में नोड्स हैं जिन्हें चुना जा सकता है। जब कोई नोड चुना जाता है, तो उपयोगकर्ता इंटरफ़ेस एक अमूर्त नोड बेस क्लास "इनोड" के साथ समाप्त होता है। इससे मुझे नोड-> getFactory() करके एक कारखाना मिलता है, और इससे मैं उस नोड के लिए एप्राइपिएट डायलॉग या विचार बना सकता हूं क्योंकि सही कारखाना कंक्रीट नोड (जैसे फैक्ट्री-> createAddDialog(), फैक्ट्री- > createView (नोड), आदि)।
मेरा प्रश्न उस कारखाने के लिए पहली जगह नोड में जाने का सबसे अच्छा तरीका खोजने का प्रयास करने के बारे में है।
अब तक मैं 3 तरीके के बारे में सोचा गया है:
1) सही कारखाना सम्मिलित करें जब मैं नोड बनाने के लिए:
AreaNode *node = new AreaNode(new AreaNodeFactory());
तो AreaNode की परिभाषा है:
AreaNode : public INode
{
AreaNode(INodeAbstractFactory *injectedFactory)
{
m_injectedFactory = injectedFactory;
}
INodeAbstractFactory* getFactory()
{
return m_injectedFactory;
}
INodeAbstractFactory* m_injectedFactory;
};
2) एक और सामान्य फैक्ट्री इंजेक्ट करें और नोड को उस कारखाने से फैक्ट्री प्राप्त करने दें:
AreaNode : public INode
{
AreaNode(IFactory *injectedFactory)
{
m_injectedFactory = injectedFactory;
}
INodeAbstractFactory* getFactory()
{
return m_injectedFactory->getAreaNodeFactory();
}
IFactory* m_injectedFactory;
}
3) बस ठोस कारखाना बनाने (हालांकि यह बाद में परिवर्तन शायद के परीक्षण के लिए एक ही नोड के लिए विभिन्न कारखानों प्रयोग करने के लिए या के लिए गुंजाइश) निकालता है:
AreaNode : public INode
{
INodeAbstractFactory* getFactory()
{
return new AreaNodeFactory();
}
}
वर्तमान विचारों को इन विकल्पों पर:
विकल्प 1: थोड़ा अजीब हो सकता है - मुझे यह सुनिश्चित करना होगा कि मैं हमेशा उस प्रकार के लिए सही कारखाना दूंगा, या शायद मैं सिर्फ मेरे लिए सही कारखाने को इंजेक्ट करने के लिए एक और कारखाना का उपयोग कर सकता हूं।
विकल्प 2: नोड को अमूर्त फैक्ट्री कार्यान्वयन के बारे में जानने के लिए मजबूर करता है जो getAreaNodeFactory को कॉल करने में सक्षम होने के लिए पर्याप्त है, जो ऐसी बुरी चीज नहीं हो सकती है। यह कम से कम यह सुनिश्चित करने में मदद करता है कि सही/एक ही कारखाना हमेशा लाया जाएगा (माना जाता है कि अधिक सामान्य कारखाना ठीक से लागू किया गया है)।
विकल्प 3: यह थोड़ा सीमित है क्योंकि मैं कक्षा को स्वैप करने में सक्षम नहीं हूं, और मैं कारखाने के ठोस कार्यान्वयन के बारे में जानने के लिए नोड पर उत्सुक नहीं हूं - हालांकि इस मामले में यह हो सकता है एक मुद्दा बहुत अधिक नहीं है (प्रसिद्ध अंतिम शब्द!)।
इस पर कोई विचार?
धन्यवाद।
संपादित करें: क्षमा करें मूल पोस्ट में परिवर्तनीय घोषणाओं को याद किया गया है, ठीक किया गया है।
संपादित करें: विकल्प 2 के साथ एक और समस्या है कि मुझे प्रत्येक नोड प्रकार में "getFactory" लागू करना है। कम से कम विकल्प 1 के साथ बेस क्लास हर बार इंजेक्ट अमूर्त कारखाना वर्ग वापस कर सकता है ..
मैं भी यकीन है कि नोड्स कारखानों का उल्लेख होना चाहिए नहीं कर रहा हूँ। यूजर इंटरफेस को एक अमूर्त फैक्ट्री का संदर्भ देना चाहिए, और इसे बनाने के तरीकों में पारित नोड के प्रकार के आधार पर सही कंक्रीट फैक्ट्री का उपयोग सुनिश्चित करने के लिए पॉलीमोर्फिज्म का उपयोग करना चाहिए। इसके अलावा मुझे लगता है कि विकल्प 1 ठीक दिखता है। लेकिन मुझे विश्वास है कि नोड्स को किसी भी कारखानों के संदर्भ के बारे में पता नहीं होना चाहिए या नहीं। – Kurt
@ कर्ट: डबल प्रेषण की अनुपस्थिति में, और प्रत्येक उपयोगकर्ता इंटरफ़ेस "एक्शन" के लिए विज़िटर क्लास के उपयोग से परहेज करते हुए मैं नोड के प्रकार के आधार पर नोड पर प्रदर्शन करना चाहता हूं, बेहतर समाधान क्या हो सकता है? एक नोड पर जो क्रिया मैं करना चाहता हूं वह इस प्रकार है: createAddDialog (parentWidget), createView (parentWidget), createMiniView (parentWidget), आदि। मैं केवल कंक्रीट नोड कक्षाओं, यानी क्षेत्र नोड के अंदर विधियों को रख सकता हूं -> createView (पैरेंट) - लेकिन यह अलगाव के लिए बहुत कुछ नहीं करता है। – Mark
हालांकि मैं विज़िटर पैटर्न के बड़े पैमाने पर उपयोग से बचने की कोशिश कर रहा हूं, वैसे ही मैं चीजों के यूआई पक्ष से नोड को पूरी तरह से रखने के लिए देख सकता हूं, उचित कारखाने वर्ग को हल करने के लिए, और एक आगंतुक से उपयोग करना तो मैं अपने यूआई घटकों को बना सकता हूं .. – Mark