2010-01-29 23 views
10

मेरे आवेदन में, कई अलग-अलग रिपोर्ट जेनरेट की जा सकती हैं (सीएसवी, एचटीएमएल, आदि)।एनम फैक्ट्री-स्टाइल विधि

पारंपरिक फैक्ट्री-स्टाइल विधि पैटर्न बनाने के बजाय, मैं enum स्थिरांक के शरीर को एक विधि जोड़ने की योजना बना रहा था जो उचित रिपोर्ट ऑब्जेक्ट को बनाए और वापस कर देगा।

public enum ReportType { 
CSV { 
    @Override 
    public Report create() { 
    return new CSVReport(); 
    } 
}, 
HTML { 
    @Override 
    public Report create() { 
    return new HTMLReport(); 
    } 
}; 

public abstract Report create(); 
} 
एक निर्दिष्ट ReportType enum निरंतर साथ

, मैं तो आसानी से एक नई रिपोर्ट निम्नलिखित की तरह एक बयान को क्रियान्वित करते हुए बना सकते हैं:

ReportType.CSV.create() 

मैं इस दृष्टिकोण का उपयोग पर दूसरों की राय प्राप्त करना चाहता था। आप इस बारे में क्या सोचते है? क्या आप कोई अन्य दृष्टिकोण पसंद करेंगे, और यदि हां, तो क्यों?

धन्यवाद

उत्तर

4

मुझे लगता है कि दोनों दृष्टिकोण ठीक हैं, लेकिन यदि आप नहीं जानना चाहते कि आप किस प्रकार की रिपोर्ट तैयार कर रहे हैं तो मेरा मानना ​​है कि enum दृष्टिकोण सबसे अच्छा है। इसलिए जैसा:

supose आप एक डेटाबेस पर एक व्यक्ति उदाहरण जारी रहती है और बाद में इसे पुनः प्राप्त - अगर आप polimorphism का उपयोग आप किसी भी स्विच wathsoever जरूरत नहीं होगी। बनाने() विधि को कॉल करने के लिए आपको केवल एक चीज की आवश्यकता होगी । जैसा:

Person person = null; 
//... retrieve the person instance from database and generate a 
//report with his/her prefered report type... 
Report report = person.getReportType.create(); 

तो अगर आप polimorphism पर भरोसा करते हैं आप स्पष्ट रूप से आप सीवीएस/HTML/पीडीएफ प्राप्त करने के लिए एक कारखाने में पूछने के लिए, Enum ही है कि काम छोड़ने की जरूरत नहीं होगी। लेकिन निश्चित रूप से, ऐसी परिस्थितियां हैं जिन्हें आपको एक या दूसरे का उपयोग करने की आवश्यकता हो सकती है, हालांकि मैं नियमित रूप से enum दृष्टिकोण का उपयोग करता हूं।

1

यहोशू बलोच (मान्यता प्राप्त जावा विशेषज्ञ) वास्तव में अपनी पुस्तक प्रभावी जावा 2 संस्करण में इस दृष्टिकोण पेज 17 पर सलाह देता है: एक निजी निर्माता या एक enum प्रकार के साथ सिंगलटन संपत्ति लागू करें।

+0

यह सिंगलेट्स के संबंध में है। – Steve

3

रिपोर्ट निर्माण के उदाहरण के लिए enum का उपयोग करके लाभ क्या है? यदि आपके पास फैक्ट्री-विधि थी तो आपने नीचे CSVReport (कहना) का उदाहरण बनाया होगा:

Report csvReport = ReportFactory.createCSVReport(); 

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

+0

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

+3

enums, और वास्तव में अमूर्त कारखानों का उपयोग करने का बिंदु, वह बिंदु है जिस पर आप निर्णय लेने के अनुरोध से कार्यान्वयन विवरण पर निर्णय लेते हैं। (इसलिए, यदि आप कभी भी उन बिंदुओं को कम करने के लिए नहीं जा रहे हैं, तो समयपूर्व संकेत में कोई बात नहीं है।) –

2

Enum with Visitor Pattern पर देखें। उस दृष्टिकोण के साथ आप enum को प्रदूषित किए बिना गतिशील रूप से एक enum में कार्यक्षमता जोड़ने में सक्षम हो जाएगा।