2011-08-09 22 views
6

मुझे यह बहुत कुछ दिखाई देता है और मैं सोच रहा था कि भारी स्विच से बचने के लिए इस अच्छी तरह से प्रतिक्रिया करने का कोई तरीका था या नहीं? यह कारखाने में एक विधि है: RoomControllerFactory, इसके प्रकार के आधार पर एक गेम स्थान को तुरंत चालू करना।क्या फ़ैक्टरी विधि में स्विच करने का कोई विकल्प है?

public static const ROOMONE : LocationType = new LocationType("locationone", 
    function(...) : RoomController { 
     return new RoomOneController 
    } 
); 

: - क्यों आप अपने enum के लिए एक विधि नहीं जोड़ते हैं के रूप में आप एक हैक का उपयोग कर रहे enum सुविधा प्रदान करने के

  switch (location.getType()) 
      { 
       case Location.ROOMONE: 
        return new RoomOneController(location, data, view);   

       case Location.ROOMTWO: 
        return new RoomTwoController(location, data, view); 

       case Location.ROOMTHREE: 
        return new RoomThreeController(location, data, view); 
+0

मुझे एक्शनस्क्रिप्ट नहीं पता है, लेकिन मैं RoomControllerFactory के साथ विभिन्न स्थानों के प्रकारों को पंजीकृत करने के लिए हैशटेबल का उपयोग करूंगा जो कि सही कक्ष नियंत्रक को तुरंत चालू कर सकता है। सी # में शुरुआती कमरा नियंत्रक कारखानों [location.getType()] = नया कमराऑनकंट्रोलर फैक्टरी(); बाद में बाद में: रूम नियंत्रक कारखानों [location.getType()]। बनाएँ (स्थान, डेटा, देखें); – Polity

+1

क्या इन कक्ष नियंत्रक उदाहरण प्रोग्राम में एक से अधिक बार तत्काल हैं? उदाहरण के लिए, यदि यह एक भूलभुलैया था, तो क्या आपके पास TeeIntersectionRoomController के कई उदाहरण होंगे? या क्या ये उदाहरण गेम में बिल्कुल अनोखे हैं, उदाहरण के लिए बकिंघमपेलसट्रोनरूम नियंत्रक? यह * सबसे अच्छा समाधान प्रभावित कर सकता है ... – jpwrunyan

+0

वे एक समय में मौजूद हैं यानी जब आप स्थान पर जाते हैं, लेकिन वर्तमान में एक से अधिक बार तत्काल हो जाते हैं, यानी यदि आप रूमोन में वापस जाते हैं तो हम कमरे को फिर से बना देंगे। लेकिन कुछ भी कमरे कुछ अनूठे हैं, कुछ कमरे पर्याप्त हैं, इन्हें एक से अधिक का प्रतिनिधित्व करने के लिए उपयोग किया जा सकता है, उदाहरण के लिए एक कमरे के प्रकार की दुकान का इस्तेमाल कई स्थानों के लिए किया जा सकता है, केवल बिक्री के लिए डेटा-सामान द्वारा, लेकिन कमरे के प्रकार का कमरा केवल एक बार इस्तेमाल किया जाएगा। मुझे उम्मीद है कि यह स्पष्ट है। :) – serenskye

उत्तर

3

संक्षिप्त उत्तर, कारखानों स्विच, यही वह है जो वे करते हैं - कारखाने की इस शैली का पूरा बिंदु निर्माण तर्क को कोडेबेस के चारों ओर घूमने के बजाय एक ही स्थान पर केंद्रीकृत करना है।

जब तक आप एक स्थिर फैक्ट्री का उपयोग नहीं कर रहे हैं और आईरूम कंट्रोलर फैक्टरी इंटरफ़ेस को कोडिंग कर रहे हैं तो आपको रनटाइम/परीक्षण के लिए उसे बाहर निकालने के सभी सामान्य ओओपी लाभ मिलते हैं - आप सब कह रहे हैं 'यो रूम कंट्रोलर फैक्टरी, मुझे दे दो इस जादू पहचानकर्ता के लिए एक कमरा!

अपने प्रश्न के आगे के उत्तर के रूप में, आप खुद से पूछना चाहेंगे कि आपको RoomController के इतने ठोस उदाहरण क्यों चाहिए? शायद विरासत पर रचना का पक्ष ले कर आप बिल्डर का उपयोग करने के लिए चीजों को दोबारा इस्तेमाल कर सकते हैं?

4

देखकर: यहाँ कारखाने विधि में एक स्विच से एक उदाहरण है (कोई भी मूर्खतापूर्ण गलतियों बहाना - actionscript मेरी पहली भाषा नहीं है!)

जावा में मैं के साथ इसी तरह करना होगा:

public enum LocationType { 
    ROOMONE { 
     @Override 
     public RoomController getRoomController() { 
      return new RoomOneController(); 
     } 
    }; 
    public abstract RoomController getRoomController(); 
} 
+0

हाँ, यह निश्चित रूप से एक क्लीनर समाधान की तरह लगता है, यह एक स्थान पर स्थान जोड़ने के लिए परिवर्तन को कम करता है और कारखाने को इसके निर्माण के बारे में जानने की आवश्यकता नहीं है :) – serenskye

+0

यदि मैं गलत हूं तो मुझे सही करें, लेकिन यह मूल " कारखाना "पूरी तरह से, सही? चूंकि कारखाना सिर्फ एक enum मूल्य की जांच कर रहा था और कक्षा के उदाहरण को थूक रहा था, है ना? मुझे लगता है कि मुझे कुछ याद आ रहा है ... – jpwrunyan

+1

इस उदाहरण में - हाँ। लेकिन व्यापक रूप से, विशिष्ट वस्तु पर वापस कार्यान्वयन की आवश्यकता हो सकती है जो फैक्ट्री को रखने की गारंटी दे सकती है। – Martyn

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