दिलचस्प पोस्ट
JavaFX टेक्स्टएरिया में हाइलाइटिंग स्ट्रिंग्स साथ-बयान के साथ उपलब्ध के साथ परिभाषित वैरिएबल? डीजांगो एकत्रीकरण: दो क्षेत्रों के गुणन का सारांश जावा: स्ट्रिंग टू टाइमस्टैम्प को कन्वर्ट करें क्या आप स्थिर क्षेत्रों के साथ @ एक्टोवर्थ का उपयोग कर सकते हैं? मैं यूट्यूब के लिए नई एंबेड कोड शैली का उपयोग कर एक वीडियो को कैसे चला सकता हूं? कैसे कीपैड पॉपअप अक्षम करने के लिए जब edittext पर? रीयलएम ऑब्जेक्ट से फील्ड वैल्यू पुनर्प्राप्त नहीं की जा सकती, मान डीबगर में शून्य हैं डुप्लिकेट प्रविष्टियों को कैसे हटाएं? PHP से MySQL में डालें (jQuery / AJAX) स्लैश का उपयोग करें sed में बदलें जावा में पूरा करने के लिए एकाधिक थ्रेड्स पर प्रतीक्षा की जा रही है बाहर निकलने () एक फ़ंक्शन के अंदर कॉल करें, जिसे संदर्भ वापस करना चाहिए क्या मतलब है। Delegate = self? कैसे mysql रूट पासवर्ड रीसेट करें?

स्थिर कारखाने के तरीके क्या हैं?

"स्थिर कारखाने" विधि क्या है?

वेब के समाधान से एकत्रित समाधान "स्थिर कारखाने के तरीके क्या हैं?"

हम डेटाबेस कनेक्शनों तक सीधी पहुंच प्रदान करने से बचते हैं क्योंकि वे संसाधन गहन हैं। इसलिए हम एक स्थिर कारखाना विधि getDbConnection उपयोग getDbConnection जो एक कनेक्शन बनाता है अगर हम सीमा से कम हो अन्यथा, यह एक "अतिरिक्त" कनेक्शन प्रदान करने का प्रयास करता है, यदि अपवाद नहीं है तो कोई भी नहीं।

 public class DbConnection{ private static final int MAX_CONNS = 100; private static int totalConnections = 0; private static Set<DbConnection> availableConnections = new HashSet<DbConnection>(); private DbConnection(){ // ... totalConnections++; } public static DbConnection getDbConnection(){ if(totalConnections < MAX_CONNS){ return new DbConnection(); }else if(availableConnections.size() > 0){ DbConnection dbc = availableConnections.iterator().next(); availableConnections.remove(dbc); return dbc; }else { throw new NoDbConnections(); } } public static void returnDbConnection(DbConnection dbc){ availableConnections.add(dbc); //... } } 

स्थैतिक कारखाना विधि पैटर्न ऑब्जेक्ट सृजन को घेरने का एक तरीका है। फ़ैक्टरी विधि के बिना, आप केवल कक्षा के निर्माता को सीधे कॉल करेंगे: Foo x = new Foo() इस पद्धति के साथ, आप इसके बजाय फ़ैक्टरी पद्धति को कॉल करेंगे: Foo x = Foo.create() । कन्स्ट्रक्टर निजी चिह्नित हैं, इसलिए उन्हें कक्षा के अंदर से छोड़कर नहीं कहा जा सकता है, और कारखाना विधि को static के रूप में चिह्नित किया जाता है ताकि इसे बिना किसी वस्तु के पहले कहा जा सके।

इस पैटर्न के कुछ फायदे हैं एक यह है कि कारखाने कई उप-वर्गों (या इंटरफ़ेस के क्रियान्वयनकर्ता) से चयन कर सकता है और यह वापस लौटा सकता है। इस तरह से कॉलर पैरामीटर के माध्यम से इच्छित व्यवहार को निर्दिष्ट कर सकता है, बिना संभावित जटिल वर्ग पदानुक्रम को जानने या समझने के लिए।

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

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

 Coordinate c = Coordinate.createFromCartesian(double x, double y) 

तथा

 Coordinate c = Coordinate.createFromPolar(double distance, double angle) 

इसका उपयोग पठनीयता को बेहतर बनाने के लिए भी किया जा सकता है, क्योंकि रास्मस नोट्स

ध्यान दें! " स्थैतिक कारखाना पद्धति फैक्ट्री विधि पैटर्न के समान नहीं है" (सी) प्रभावी जावा, यहोशू ब्लॉच

फैक्टरी विधि: "किसी ऑब्जेक्ट को बनाने के लिए एक इंटरफ़ेस को परिभाषित करें, लेकिन इंटरफ़ेस को लागू करने वाले वर्ग तय करें कि किस क्लास को इन्स्टिट्यूट करना चाहिए। फैक्टरी विधि से क्लास को उप-क्लासेस को तत्काल प्रदान करने देता है" (सी) गोएफ़

"स्थैतिक कारखाना विधि बस एक स्थैतिक विधि है जो क्लास का एक उदाहरण देता है।" (सी) प्रभावी जावा, यहोशू ब्लोच आमतौर पर यह विधि एक विशेष वर्ग के अंदर है।

विलंब:

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

  • का मूल्य
  • दृष्टांत लो
  • newInstance

पठनीयता स्थिर कारखाने के तरीकों से सुधार की जा सकती है:

तुलना

 public class Foo{ public Foo(boolean withBar){ //... } } //... // What exactly does this mean? Foo foo = new Foo(true); // You have to lookup the documentation to be sure. // Even if you remember that the boolean has something to do with a Bar // you might not remember whether it specified withBar or withoutBar. 

सेवा मेरे

 public class Foo{ public static Foo createWithBar(){ //... } public static Foo createWithoutBar(){ //... } } // ... // This is much easier to read! Foo foo = Foo.createWithBar(); 
  • नाम हैं, कन्स्ट्रक्टर के विपरीत, जो कोड को स्पष्ट कर सकते हैं।
  • प्रत्येक आवर्तन पर एक नया ऑब्जेक्ट बनाने की आवश्यकता नहीं है – ऑब्जेक्ट को कैश्ड और पुन: उपयोग किया जा सकता है, यदि आवश्यक हो।
  • उनके रिटर्न प्रकार का एक उप-प्रकार लौटा सकते हैं – विशेष रूप से, किसी ऑब्जेक्ट को वापस कर सकते हैं जिसका कार्यान्वयन क्लास कॉलर के लिए अज्ञात है। यह कई चौखटे में एक बहुत ही मूल्यवान और व्यापक रूप से उपयोग की जाने वाली सुविधा है, जो रिटर्न प्रकार के स्थैतिक कारखाने के तरीकों के रूप में इंटरफेस का उपयोग करते हैं।

http://www.javapractices.com/topic/TopicAction.do?Id=21 से

यह सभी रखरखाव के लिए नीचे फोड़े। यह सबसे अच्छा तरीका है जब आप किसी वस्तु को बनाने के लिए new कीवर्ड का उपयोग करते हैं, तो आप उस कार्यान्वयन के लिए लिख रहे कोड को जोड़ रहे हैं

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

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

यदि किसी वर्ग के कन्स्ट्रक्टर निजी है तो आप इसके बाहर कक्षा के लिए कोई ऑब्जेक्ट नहीं बना सकते।

 class Test{ int x, y; private Test(){ ....... ....... } } 

हम ऊपर के वर्ग के लिए किसी वस्तु को इसके बाहर से नहीं बना सकते। तो आप वर्ग के बाहर x, y तक पहुंच नहीं सकते हैं। तो इस वर्ग का क्या उपयोग है?
यहां समाधान है: फैक्टरी विधि
उपरोक्त वर्ग में निम्न विधि शामिल करें

 public static Test getObject(){ return new Test(); } 

तो अब आप इस वर्ग के बाहर से एक वस्तु बना सकते हैं। इस प्रकार…

 Test t = Test.getObject(); 

एक स्थिर विधि जो अपने निजी कन्स्ट्रक्टर को निष्पादित करके वर्ग के ऑब्जेक्ट को लौटाती है फैक्टरी विधि कहा जाता है

मैंने सोचा कि मैं इस पोस्ट पर कुछ प्रकाश जोड़ूंगा जो मुझे पता है। हमने इस तकनीक को हमारे recent android project में व्यापक रूप से इस्तेमाल किया है। creating objects using new operator को creating objects using new operator बजाय आप कक्षा को इन्स्तांत करने के लिए static method का उपयोग भी कर सकते हैं। कोड लिस्टिंग:

 //instantiating a class using constructor Vinoth vin = new Vinoth(); //instantiating the class using static method Class Vinoth{ private Vinoth(){ } // factory method to instantiate the class public static Vinoth getInstance(){ if(someCondition) return new Vinoth(); } } 

स्थैतिक तरीकों सशर्त ऑब्जेक्ट सृजन का समर्थन करते हैं : हर बार जब आप एक कन्स्ट्रक्टर का आह्वान करते हैं तो कोई ऑब्जेक्ट बनाया जाएगा, लेकिन आप ऐसा नहीं कर सकते। मान लीजिए आप कुछ शर्त जांचना चाहते हैं, तभी आप एक नया ऑब्जेक्ट बनाना चाहते हैं.आप हर बार विनोथ का एक नया उदाहरण नहीं बना रहेगा, जब तक आपकी स्थिति संतुष्ट न हो।

प्रभावी जावा से लिया गया एक अन्य उदाहरण

 public static Boolean valueOf(boolean b) { return (b ? TRUE : FALSE); } 

यह विधि एक बूलीयन आदिम मान को बूलियन ऑब्जेक्ट संदर्भ में तब्दील करती है। Boolean.valueOf(boolean) विधि हमें दिखाता है, यह कभी भी एक वस्तु नहीं बनाता है बार-बार invocations से समान वस्तु वापस करने के लिए static factory methods की क्षमता वर्गों को किसी भी समय मौजूद उदाहरणों पर सख्त नियंत्रण बनाए रखने की अनुमति देता है।

Static factory methods यह है कि, कंसल्टर्स के विपरीत, वे अपने रिटर्न प्रकार के किसी भी subtype के object को वापस कर सकते हैं। इस लचीलेपन का एक आवेदन यह है कि एपीआई अपनी कक्षाओं को सार्वजनिक किए बिना वस्तुओं को वापस कर सकती है। इस फैशन में कार्यान्वयन कक्षाओं को छिपाते हुए एक बहुत कॉम्पैक्ट एपीआई होता है

Calendar.getInstance () उपरोक्त के लिए एक बढ़िया उदाहरण है, यह स्थानीय BuddhistCalendar कैलेंडर के आधार पर बनाता है, JapaneseImperialCalendar इंपीरियल कैलेंडर या डिफ़ॉल्ट रूप से एक Georgian

एक और उदाहरण जो मैं सोच सकता था कि Singleton pattern , जहां आप अपने कन्स्ट्रक्टर को निजी बनाते हैं, अपनी खुद की getInstance पद्धति बनाते हैं, जहां आप यह सुनिश्चित करते हैं कि हमेशा एक उदाहरण उपलब्ध है।

 public class Singleton{ //initailzed during class loading private static final Singleton INSTANCE = new Singleton(); //to prevent creating another instance of Singleton private Singleton(){} public static Singleton getSingleton(){ return INSTANCE; } } 

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

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

स्टैटेक्टिक फैक्ट्री से उत्पन्न होने वाले लाभों में से एक यह है कि एपीआई अपनी कक्षाएं सार्वजनिक किए बिना वस्तुएं वापस कर सकती हैं। यह बहुत कॉम्पैक्ट एपीआई का नेतृत्व जावा में यह कलेक्शंस क्लास द्वारा प्राप्त किया जाता है जो करीब 32 कक्षाएं छिपाता है जो इसे एपीआई बहुत कॉम्पैक्ट बनाता है।

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

उदाहरण के लिए, डेटाबेस कनेक्शन वर्ग में, आप केवल एक ही वर्ग को डेटाबेस कनेक्शन बना सकते हैं, ताकि आप MySQL से ऑरेकल में स्विच करने का निर्णय ले सकें, आप केवल एक कक्षा में तर्क को बदल सकते हैं, और शेष एप्लिकेशन नए कनेक्शन का उपयोग करें

यदि आप डेटाबेस पूलिंग को लागू करना चाहते हैं, तो यह भी शेष आवेदन को प्रभावित किए बिना किया जाएगा।

यह बाकी हिस्सों को उन परिवर्तनों से बचाता है जो आप कारखाने में कर सकते हैं, जो उद्देश्य है

इसके लिए स्थिर होने का कारण यह है कि यदि आप कुछ सीमित संसाधनों (सॉकेट कनेक्शन या फ़ाइल हैंडल की संख्या) का ट्रैक रखना चाहते हैं तो इस वर्ग का पता लगाया जा सकता है कि कितने पारित हो चुके हैं और वापस आये हैं, इसलिए आप निकाले नहीं सीमित संसाधन

स्थिर

एक सदस्य ने 'स्थिर' कीवर्ड के साथ घोषित किया

कारखाने के तरीकों

नई ऑब्जेक्ट बनाने और वापस लाने वाली विधियां

जावा में

प्रोग्रामिंग भाषा 'स्थिर' के अर्थ से प्रासंगिक है लेकिन 'कारखाने' की परिभाषा के अनुसार नहीं है

जावा कार्यान्वयन में उपयोगिताओं वर्गों java.util.Arrays और java.util.Collections दोनों में स्थिर कारखाने के तरीके शामिल हैं , इसका उदाहरण और कैसे उपयोग करें:

  • Arrays.asList("1","2","3")

  • Collections.synchronizedList(..), Collections.emptyList(), Collections.unmodifiableList(...) निष्पक्ष लिस्ट Collections.synchronizedList(..), Collections.emptyList(), Collections.unmodifiableList(...) अनमोडिफायबल लिस्ट Collections.synchronizedList(..), Collections.emptyList(), Collections.unmodifiableList(...) (केवल कुछ उदाहरण, mor विधियों के उदाहरणों के लिए javadocs की जांच कर सकते हैं https://docs.oracle.com/javase/8/docs/ api / java / util / collections.html )

इसके अलावा java.lang.String वर्ग में ऐसी स्थैतिक कारखाने के तरीके हैं :

  • String.format(...), String.valueOf(..), String.copyValueOf(...)