2010-11-16 9 views
13

मैं, यहोशू बलोच के Effective Java में वर्णित के रूप विचार और एक स्थिर कारखाने विधि के लाभों से परिचित हूँ:स्थिर फैक्ट्री विधि के लिए यथार्थवादी उपयोग केस?

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

अब मैं जावा और ओओ सिद्धांतों को सीखने वाले किसी व्यक्ति के लिए स्थिर फैक्ट्री विधियों को समझाने की कोशिश कर रहा हूं। वह अवशोषण के बजाय ठोस परिदृश्य से सबसे अच्छी तरह से सीखती है। अगर वह काम पर पैटर्न देख सकती है, तो कुछ समस्या हल कर सकती है, उसे मिल जाएगी। लेकिन पैटर्न को लागू करने के तरीके को समझने के लिए उपर्युक्त जैसी विशेषताओं की एक अमूर्त सूची को पढ़ना मुश्किल लगता है।

क्या आप मुझे स्थिर फैक्ट्री विधि का उपयोग करने के यथार्थवादी उदाहरण के साथ आने में मदद कर सकते हैं, जिससे इसका लाभ स्पष्ट हो जाता है, लेकिन जो अभी भी एक प्रारंभिक जावा क्लास में किसी को दिखाने के लिए पर्याप्त है?

इस व्यक्ति के पास पीएल/एसक्यूएल में प्रोग्रामिंग अनुभव है लेकिन ओओपी पैटर्न सीखने के लिए कभी नहीं मिला है।

+0

इसे चेक आउट किया गया? http://stackoverflow.com/questions/929021/what-are-static-factory-methods-in-java –

उत्तर

15

सभी तीन बिंदुओं के उदाहरण के रूप में javax.swing.BorderFactory का उपयोग करें।

इस वर्ग का उपयोग स्विंग ऑब्जेक्ट्स के लिए सीमा बनाने के लिए किया जाता है। इन सीमा वस्तुओं को आसानी से फिर से उपयोग किया जा सकता है, और यह कारखाना विधि इसके लिए अनुमति देता है। यहां the javadoc है।

  • createEmptyBorder() और createEtchedBorder() की तरह अलग अलग नामों के साथ एकाधिक स्थिर तरीकों के होते हैं: इस कारखाने सभी तीन अंक का एक बड़ा उदाहरण है।
  • ये विधियां संभवतः पहले बनाए गए ऑब्जेक्ट्स को वापस लौटाएंगी। यह अक्सर होता है कि एक ही सीमा एक आवेदन के दौरान इस्तेमाल किया जाएगा।
  • Border स्वयं वास्तव में एक इंटरफेस है, इसलिए इस कारखाने के माध्यम से बनाई गई सभी वस्तुएं वास्तव में कक्षाएं हैं जो इस इंटरफ़ेस को लागू करती हैं।
+1

यह एक शानदार उदाहरण है। –

+0

@Erick मुझे आपका उदाहरण पसंद आया। लेकिन पुस्तक इस एप्लिकेशन का भी तात्पर्य है: इस लचीलापन का एक आवेदन यह है कि एक एपीआई के बिना अपनी कक्षाओं को सार्वजनिक किए बिना वस्तुओं को वापस कर सकता है। लेकिन आपके उदाहरण मामले में, सभी वर्ग सार्वजनिक हैं। तो, क्या ऐसा कोई उदाहरण है जो इस एप्लिकेशन को भी शामिल करता है? – dosdebug

4

अपने दूसरे बिंदु के पाठ्यपुस्तक उदाहरण Integer.valueOf(int) (Boolean, Short, Long, Byte के लिए समान) है। पैरामीटर मानों के लिए -128 से 127 तक, यह विधि एक नया Integer बनाने के बजाय कैश किए गए उदाहरण देता है। यह ठेठ मूल्यों के लिए (ऑटो) मुक्केबाजी/अनबॉक्सिंग अधिक प्रदर्शन करता है।

आप new Integer() साथ ऐसा नहीं कर सकते क्योंकि JLS की आवश्यकता है कि new एक नया उदाहरण हर बार यह कहा जाता है पैदा करते हैं।

3

Calendar.getInstance() एक अच्छा exmaple नहीं होगा? यह लोकल को बौद्ध कैलेंडर, जापानी इंपीरियल कैलेंडर या डिफ़ॉल्ट रूप से ग्रेगोरियन कैलेंडर के आधार पर बनाता है।

+0

-1 यह कोई जवाब नहीं है, यह एक प्रश्न है। –

0

यहां एक ऐसा है जो मुझे थोड़ी देर पहले करना था। नौकरी के साक्षात्कार में, मुझे उन कार्डों का एक डेक प्रोग्राम करने के लिए कहा गया जहां उन्हें शफ़ल किया जा सकता था। वास्तव में सरल समस्या है।मैंने बनाया:

Card: 
    suit 
    rank 

Deck: 
    card[] 

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

  1. अपरिवर्तनीय
  2. वस्तु के नियंत्रण निर्माण
  3. स्थिर तरीकों
  4. संभवतः उपवर्गीकरण और किसी अन्य स्रोत से एक कार्ड वापस जाएँ। (मैंने यह नहीं किया)

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

मुझे आशा है कि इस मदद करता है!

+0

इस विशेष उदाहरण के साथ मैं एक enum का पीछा भी कर सकता हूं, क्योंकि यह आपके वर्ग के हर एक उदाहरण को संकलित समय में जाना जाता है जिसे कभी बनाया जा सकता है। –

+0

मैंने वास्तव में एक enum किया था! मैंने दो, तीन, चार ... जैक, रानी, ​​राजा, और ऐस किया था। मैंने दिल, क्लब, हुकुम और हीरे भी बनाए। यह पूरी तरह से काम करता था क्योंकि सबकुछ संकलित समय पर स्थिर रूप से चेक किया गया था और valueOf (रैंक रैंक, सूट सूट) के लिए मेरे पैरामीटर। बहुत सरल लेकिन अभी तक ओओ प्रोग्रामिंग के बारे में बहुत कुछ सिखाता है। –

0

सरल मामला। मान लें कि आपके पास एक वर्ग है जो कुछ प्रकार के प्रिंटर संचालित करता है, लेकिन यह परवाह नहीं करता है कि यह ईपीएस, कैनन या कुछ और है। तो, आप बस एक इंटरफ़ेस Printer बनाएं, इसके कुछ कार्यान्वयन बनाएं और एक वर्ग बनाएं जिसमें केवल एक विधि हो: CreatePrinter।

तो, कोड सरल हो जाएगा:

public interface Printer { 
     print(); 
    } 

    class CanonPrinter implements Printer { 
     print() { 
    // ... 
     } 
    } 


    public PrinterFactory { 

    Printer createPrinter() { 
    if (...) { 
     return new CanonPrinter(); 
    } else { 
     return new EpsonPrinter(); 
    } 
} 
} 

ग्राहक कोड:

Printer printer = PrinterFactory.createPrinter(); 
printer.print(); 

यहाँ आप सार आप क्या प्रिंटर आप के साथ काम या कैसे वे मुद्रण प्रबंधन कर सकते हैं की किसी भी जानकारी से कोड clinet । यह प्रिंटर फैक्ट्री है जो कि प्रिंटर चुनने की परवाह करता है अगर उदाहरण के लिए एक दोष है।

4

इस पैटर्न का मेरा वर्तमान पसंदीदा उदाहरण Guava का ImmutableList है। इसके उदाहरण केवल स्थिर कारखानों या एक निर्माता द्वारा बनाए जा सकते हैं। यहां दी गई कुछ है कि इस लाभप्रद है कर रहे हैं:

  • ImmutableList के बाद से किसी भी public या protected कंस्ट्रक्टर्स का खुलासा नहीं करता है, यह है, जबकि उपयोगकर्ताओं के लिए यह उपवर्ग (और संभवत: तोड़ने अपनी अचल स्थिति गारंटी) करने की अनुमति नहीं पैकेज में subclassed जा सकता है।
  • यह देखते हुए कि, इसके फैक्ट्री विधियां अपने प्रकार के खुलासा किए बिना इसके विशेष उप-वर्गों को वापस करने में सक्षम हैं।
  • इसकी ImmutableList.of() फैक्टरी विधि का सिंगलटन उदाहरण देता है। यह दर्शाता है कि यदि एक स्थिर उदाहरण के लिए एक स्थिर कारखाने विधि की आवश्यकता नहीं है तो उसे एक नया उदाहरण बनाने की आवश्यकता नहीं है।
  • इसकी ImmutableList.of(E) विधि SingletonImmutableList का एक उदाहरण देता है जो अनुकूलित है क्योंकि यह केवल 1 तत्व को ही रखेगा।
  • इसके अधिकांश कारखाने के तरीके RegularImmutableList लौटाते हैं।
  • इसकी copyOf(Collection) स्थैतिक फैक्ट्री विधि को हमेशा एक नया उदाहरण बनाने की आवश्यकता नहीं है ... यदि Collection यह दिया गया है तो यह ImmutableList है, यह बस इसे वापस कर सकता है!
+0

ठीक है मैं काट दूंगा। एक खाली अपरिवर्तनीय सूची के साथ वास्तव में क्या होगा? –

+2

@ क्रिस: वही बात जो करता है, कहें, 'संग्रह .emptyList() '(जो एक अपरिवर्तनीय सिंगलटन भी है)। जब कोई सूची 'सूची' लौटाती है, तो उसके पास वापस आने के लिए कोई डेटा नहीं होता है, तो उसे हमेशा 'शून्य' के बजाय खाली 'सूची' वापस करना चाहिए। चूंकि एक खाली, अपरिवर्तनीय संग्रह कभी भी कोई डेटा नहीं रख सकता है, इसलिए इसकी आवश्यकता होने पर सिंगलटन इंस्टेंस का उपयोग किया जा सकता है। इसके अलावा, यह उदाहरण जितना संभव हो उतना हल्का हो सकता है क्योंकि इसे किसी भी चीज़ को पकड़ने के लिए आंतरिक रूप से किसी भी डेटा संरचना की आवश्यकता नहीं होती है। – ColinD

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