2010-01-25 25 views
8

मैं एक समस्या यह है कि एक अपेक्षाकृत बड़े वस्तु पदानुक्रम शामिल है इस प्रकार है की एक बड़ी पदानुक्रम का निर्माण करने की:पैटर्न वस्तुओं

  • खेल एक समुदाय प्रबंधक है
  • समुदाय प्रबंधक एक नेटवर्क है
  • नेटवर्क में कई खिलाड़ी
  • नेटवर्क में कई दोस्त हैं ips
  • खिलाड़ी है एक रणनीति प्रबंधक
  • खिलाड़ी एक मेमोरी है
  • खिलाड़ी एक पड़ोस है
  • पड़ोस कई खिलाड़ियों
  • रणनीति प्रबंधक कई रणनीतियों
  • है है

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

वस्तुओं के जटिल पदानुक्रम के निर्माण के मामले में उपयोग करने के लिए सबसे अच्छा पैटर्न क्या है? मैंने Factory Method, Abstract Factory और Builder पैटर्न पर पढ़ा है और मुझे लगता है कि कारखाने के पैटर्न में से एक उपयुक्त है लेकिन मुझे वास्तव में यह नहीं पता कि इस तरह के जटिल पदानुक्रम में इसे कैसे लागू किया जाए?

जैसा कि मैंने इसे देखा है, मुझे सिस्टम के प्रत्येक भाग के लिए कई कारखानों की आवश्यकता होगी, लेकिन इसके परिणामस्वरूप मॉडल वर्गों को मिरर करने वाले कारखाने वर्गों का संग्रह होगा।


संपादित करें: यह अब तक कि मैं कारण है कि मैं कारखानों की आवश्यकता होती है बल्कि कंस्ट्रक्टर्स खुद को उनके निर्भरता का निर्माण करने के लिए अनुमति देता है की तुलना में मेरी वस्तु पदानुक्रम का निर्माण करने के बारे में अधिक विस्तार से बताया जाना चाहिए था दिए गए सुझाव में हुई चर्चाओं से स्पष्ट हो गया है।

ऐसा इसलिए है क्योंकि मैं परीक्षण संचालित विकास में सहायता के लिए निर्भरता इंजेक्शन का उपयोग कर रहा हूं। मैं परीक्षण के लिए एक मजाकिया दृष्टिकोण ले रहा हूं जिसके लिए किसी ऑब्जेक्ट की निर्भरताओं का प्रतिनिधित्व करने वाले मैक्स को इंजेक्ट करने की क्षमता की आवश्यकता होती है और इस तरह मुझे किसी भी निर्माता में new का उपयोग करने से बचना होगा।

दिए गए सुझाव से अब तक ऐसा लगता है ऐसा करने का संभावित तरीकों में से एक संख्या हैं:

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

मैं लेने के लिए इच्छुक हूँ में बदलता है इन तरीकों जहां कारखाने कक्षाएं केवल बनाई गई हैं का एक संयोजन का उपयोग करें अंतिम मार्ग इस स्थिति में लेने के लिए सबसे अच्छे दृष्टिकोण पर सर्वसम्मति क्या है?


संपादित करें: मैं अब कि इस सवाल का ध्यान स्पष्ट कर दिया गया है के बाद से वर्तमान जवाब (पैट्रिक कार्चर से एक) को निरस्त करने की रही है, सुझाव से कोई भी पूरा जवाब नहीं है।

+0

स्पष्टता के लिए एक नया प्रश्न (इस संदर्भ में) पूछना बेहतर होगा। –

उत्तर

2

यदि कुछ भी, यानी भिन्न होता है। यदि आपकी निर्माण प्रक्रिया तय की गई है, तो मैं सबसे सरल तरीके से अनुशंसा करता हूं: क्या वस्तुएं स्वयं अपनी आश्रित वस्तुओं का निर्माण करने और लिंक (संभावित द्वि-दिशात्मक) स्थापित करने की देखभाल करती हैं।

उदाहरण: बच्चों का एक संग्रह के साथ एक माता पिता वस्तु, माता पिता के एक addChild विधि है कि द्वि-दिशात्मक रिश्ते की जुटना सुनिश्चित हो सकता है के लिए:

  1. बच्चे के पिछले माता पिता मिल; अगर शून्य नहीं है, तो उस पुराने माता-पिता से बच्चे को हटा दें।
  2. बच्चे में पैरेंट फ़ील्ड को नए माता-पिता
  3. में बदलें, बच्चे को नए माता-पिता के बच्चों के संग्रह में जोड़ें।

कुछ भिन्न होता है, तो की तुलना में कुछ संदर्भ में इस्तेमाल किया जाना चाहिए उपवर्गों की तरह है, तो आप वास्तव में क्या भिन्न होता है परिभाषित करने के लिए किया है। आपकी सटीक आवश्यकता के बाद ही, सही पैटर्न दिखाई दे सकते हैं। :-)

हम पिछले भाग के साथ मदद कर सकता है, लेकिन आप केवल एक है कि आवश्यक जानकारी दे सकते हैं कर रहे हैं ... ;-)

+1

+1 ऐसे सामान्य प्रश्न का कोई अच्छा जवाब नहीं है। – peterchen

+0

जैसा कि पैट्रिक ने कहा था, मुझे वास्तव में निर्भरता इंजेक्शन की आवश्यकता है इसलिए मैं कारखाना मार्ग ले रहा था। क्षमा करें, मुझे अपनी प्रारंभिक पोस्ट में यह स्पष्ट करना चाहिए था। उससे अलग डोमेन वर्गों में से कुछ अलग-अलग होते हैं, विशेष रूप से खिलाड़ियों। प्रत्येक खिलाड़ी के पास गेम में परिणाम चुनने का एक तरीका होता है और वर्तमान में मेरे पास प्लेयर कक्षाओं का पदानुक्रम है। क्या इसका मतलब है कि मेरे पास जनरेटिंग प्लेयर को संभालने के लिए एक कारखाना होना चाहिए और एक कन्स्ट्रक्टर अन्य संस्थाओं को संभालने देना चाहिए? मुझे यह भी यकीन नहीं है कि निर्भरता इंजेक्शन यहां फिट बैठता है ... – tobyclemson

+0

@toby ok। क्या आपको लगता है कि आप इस प्रश्न के साथ अपने प्रश्न को अपडेट करेंगे, पाठकों को कुछ संदर्भ दें, और समझाएं कि समाधान क्यों चुना जाता है? जैसा कि आपने पूछा था – KLE

4

यह को समझने के लिए क्यों वास्तव में आप एक कारखाने की जरूरत है महत्वपूर्ण है। बहुत से "अच्छे" प्रथाओं के साथ, एक कारखाना कुछ फायदे पैदा कर सकता है, जिसे आप कभी-कभी चाहते हैं, और जिसे आप केवल उन्हें सही तरीके से उपयोग करके प्राप्त करते हैं।

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

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

लोकप्रियता में तेजी से बढ़ रहे कारखाने का एक उपयोग है, और विशेष उल्लेख के योग्य है। inject dependencies पर विशेष रूप से यूनिट परीक्षण के लिए गलत दिशा की परत जोड़ने के लिए यह फ़ैक्टरी क्लास का उपयोग है।

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

क्या आपके पास विशेष कारण हैं कि आपको समर्पित फैक्ट्री ऑब्जेक्ट्स की आवश्यकता क्यों है?

+0

मुझे नहीं लगता था कि यह पहले से संबंधित था लेकिन, हाँ, मैं मॉडलों के पदानुक्रम में निर्भरता इंजेक्शन का उपयोग कर रहा हूं क्योंकि मैं पूरे व्यवहार में विकास के साथ व्यवहार संचालित विकास का उपयोग करने की कोशिश कर रहा हूं। चट्टानों को इंजेक्शन करने के लिए निर्भरता की आवश्यकता होती है जहां तक ​​मैं समझता हूं। मुझे लगता है कि सवाल यह है कि क्या दो रचनाकार हैं, निर्भरता इंजेक्शन के लिए एक और दूसरा अपनी निर्भरताओं का निर्माण करने वाली वस्तु के लिए या निर्भरता प्रदान करने और प्रदान करने के लिए कारखाने का उपयोग करना है या नहीं। क्या पूर्व एक आम दृष्टिकोण है? मैं बाद के प्रति अधिक इच्छुक हूं। – tobyclemson

+0

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

+0

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

2

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

+0

क्या यह कुछ सामान्य रूप से किया जाता है - ऐसा लगता है कि प्रत्येक डोमेन क्लास के लिए फैक्ट्री क्लास पदानुक्रम होने के लिए काफी फूला हुआ लगता है? – tobyclemson

+1

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

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