2010-09-22 14 views
5

मैं क्या एक पिछले प्रश्न को यह जवाब में प्रस्तावित किया गया है की तर्ज पर एक फैक्टरी वर्ग को लागू करने पर काम कर रहा हूँ बिना instantiated नहीं किया जा सकता है:Parameterized फैक्टरी और उत्पाद वर्गों कि फैक्टरी

Factory method implementation - C++

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

मुझे इस बात की अच्छी समझ है कि ऊपर से जुड़ी विधि कैसे काम करता है और वह काम कर रहा है।

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

इसी तरह, अगर मैं सिर्फ कनेक्शन वर्गों के साथ फैक्टरी वर्ग दोस्त बनाए यह तो यह उनके निजी कंस्ट्रक्टर्स यहां पहुंच सकता है निर्माण करने के लिए चाहिए था, कि काम करेगा, लेकिन मैं Abstact आधार वर्ग के माध्यम से लागू नहीं क्योंकि मित्र 'नहीं कर रहे हो सकता है विरासत में नहीं मिला। प्रत्येक सबक्लास को फैक्ट्री के साथ स्पष्ट रूप से दोस्त बनना होगा।

क्या कोई ऊपर बताए गए कार्यों को लागू करने की विधि सुझा सकता है?

आवश्यकताओं दोहराना करने के लिए:

1 - फैक्टरी है कि वस्तुओं सब फैक्टरी का बनाएं विधि के लिए पहचानकर्ता में पारित के आधार पर एक ही आधार वर्ग से प्राप्त की एक किस्म पैदा करता है।

2 - सभी उपवर्गों कि कारखाना स्वचालित रूप से कारखाना (देखें अतः ऊपर का जवाब जुड़े)

3 के साथ एक निर्माण कार्य और पहचानकर्ता रजिस्टर करेंगे उत्पादन करने की आवश्यकता होगी - सभी उपवर्गों कि कारखाना नहीं करना चाहिए का उत्पादन करेगा फैक्ट्री

4 के माध्यम से तत्काल (तत्काल?) हो सकता है - विरासत का उपयोग कर सार आधार वर्ग के हिस्से के रूप में # 3 को स्पष्ट रूप से लागू करें। किसी को अस्थायी आधार वर्ग से उप-वर्ग करने की संभावना को हटाएं जबकि वस्तुओं को स्वतंत्र रूप से तत्काल करने के लिए तंत्र प्रदान करें।

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

मैं इस संभावना के लिए खुला हूं कि यह हासिल करने का यह सबसे अच्छा तरीका नहीं है, और अन्य विकल्पों के सुझावों का स्वागत है।

संपादित करें - जब मैं आशा करता हूं कि यह स्पष्ट हो जाए तो मैं कुछ कोड स्निपेट जोड़ूंगा।

उत्तर

1

यदि मैं आपको सही ढंग से समझता हूं तो मुझे लगता है कि आप METADECL मैक्रो में जो कुछ भी चाहते हैं, उसे मैं अपने उत्तर में बता सकता हूं, यानी एक स्थिर निर्माता फ़ंक्शन को परिभाषित करता हूं जो एक मित्र है या इसे स्थिर विधि के रूप में घोषित करता है। इससे आपके लिए कन्स्ट्रक्टर को सार्वजनिक उपयोग आदि से प्रतिबंधित करना संभव हो जाएगा।

नीचे मैं यह इंगित करने का प्रयास करता हूं कि METADECL (और METAIMPL) होना चाहिए। मैं इसे आप के लिए छोड़ लागू करने के लिए आप वहां क्या जरूरत है (मैं आप में विश्वास करते हैं)

हैडर फ़ाइल

class MySubClass : public FactoryObjectsRoot { 
    METADECL(MySubClass) // Declare necessary factory construct 
    : 
    : 
}; 

स्रोत फ़ाइल

METAIMPL(MySubClass) // Implement and bootstrap factory construct 
सभी उपवर्गों कि मेरी फैक्टरी का उत्पादन करेगा के लिए
+0

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

+0

(जारी) का उत्तराधिकारी बनाना चाहता हूं जो सी ++ में समझ में नहीं आता है। न ही बेस क्लास में एक शुद्ध वर्चुअल प्राइवेट कन्स्ट्रक्टर है जो लागू करेगा कि सभी सबक्लास में निजी कन्स्ट्रक्टर भी होंगे। – MTLPhil

+0

उदाहरण के लिए, उपरोक्त लिंक किए गए प्रश्न में उत्तर में क्लाइंट कोड केवल _name * create_ ## _name() फ़ंक्शन को कॉल नहीं कर सकता है और फैक्ट्री को पूरी तरह से बाधित कर सकता है? – MTLPhil

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