"स्थिर कारखाना" विधि क्या है?
"स्थिर कारखाना" विधि क्या है?
जवाबों:
हम डेटाबेस कनेक्शन तक सीधी पहुँच प्रदान करने से बचते हैं क्योंकि वे संसाधन गहन हैं। इसलिए हम एक स्थिर फैक्ट्री विधि का उपयोग 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);
//...
}
}
स्थिर कारखाने विधि पैटर्न Encapsulate वस्तु निर्माण के लिए एक तरीका है। एक कारखाने विधि के बिना, आप सीधे वर्ग के निर्माता को सीधे कॉल करेंगे Foo x = new Foo()
:। इस पैटर्न के साथ, आप इसके बजाय फ़ैक्टरी विधि कहेंगे Foo x = Foo.create()
:। कंस्ट्रक्टर निजी चिह्नित हैं, इसलिए उन्हें कक्षा के अंदर से छोड़कर नहीं बुलाया जा सकता है, और कारखाने की विधि के रूप में चिह्नित किया गया हैstatic
ताकि इसे पहले एक वस्तु के बिना बुलाया जा सके।
इस पैटर्न के कुछ फायदे हैं। एक यह है कि कारखाना कई उपवर्गों (या किसी इंटरफ़ेस के कार्यान्वयनकर्ता) से चुन सकता है और वापस लौट सकता है। इस तरह से कॉलर संभावित जटिल वर्ग पदानुक्रम को जानने या समझने के बिना मापदंडों के माध्यम से वांछित व्यवहार को निर्दिष्ट कर सकता है।
एक और फायदा यह है कि मैथ्यू और जेम्स ने एक सीमित संसाधन जैसे कनेक्शन तक पहुंच को नियंत्रित किया है। यह पुन: प्रयोज्य वस्तुओं के पूल को लागू करने का एक तरीका है - किसी वस्तु के निर्माण, उपयोग और फाड़ने के बजाय, यदि निर्माण और विनाश महंगी प्रक्रियाएं हैं, तो उन्हें एक बार बनाने और उन्हें रीसायकल करने के लिए अधिक समझदारी हो सकती है। फ़ैक्टरी पद्धति किसी मौजूदा, अप्रयुक्त तात्कालिक वस्तु को वापस कर सकती है यदि उसके पास एक है, या एक का निर्माण करें यदि ऑब्जेक्ट की गिनती कुछ कम सीमा से नीचे है, या एक अपवाद फेंक दें या null
ऊपरी सीमा से ऊपर होने पर वापस लौटें ।
विकिपीडिया पर लेख के अनुसार, कई कारखाने विधियाँ समान तर्क प्रकारों की विभिन्न व्याख्याओं की भी अनुमति देती हैं। आम तौर पर कंस्ट्रक्टर का वर्ग के समान नाम होता है, जिसका अर्थ है कि आपके पास दिए गए हस्ताक्षर के साथ केवल एक कंस्ट्रक्टर हो सकता है । फैक्टरियां इतनी विवश नहीं हैं, जिसका अर्थ है कि आपके पास दो अलग-अलग तरीके हो सकते हैं जो एक ही तर्क प्रकारों को स्वीकार करते हैं:
Coordinate c = Coordinate.createFromCartesian(double x, double y)
तथा
Coordinate c = Coordinate.createFromPolar(double distance, double angle)
इसका उपयोग पठनीयता में सुधार करने के लिए भी किया जा सकता है, जैसा कि रासमस नोट्स।
ध्यान दें! " स्थिर कारखाने विधि है नहीं के रूप में ही फैक्टरी विधि पैटर्न" (ग) प्रभावी जावा, यहोशू बलोच।
फ़ैक्टरी विधि: "ऑब्जेक्ट बनाने के लिए एक इंटरफ़ेस को परिभाषित करें, लेकिन इंटरफ़ेस को लागू करने वाली कक्षाओं को यह तय करने दें कि कौन सी क्लास को इंस्टेंटेज करना है। फ़ैक्ट्री विधि से क्लास को उपक्लास करने के लिए एक त्वरित बचाव की सुविधा मिलती है" (c) GoF।
"स्टैटिक फैक्ट्री विधि एक स्थिर विधि है जो एक वर्ग का एक उदाहरण देता है।" (c) प्रभावी जावा, जोशुआ बलोच। आमतौर पर यह विधि एक विशेष वर्ग के अंदर होती है।
अंतर:
स्थैतिक कारखाने विधि का मुख्य विचार वस्तु निर्माण पर नियंत्रण हासिल करना और इसे निर्माणकर्ता से स्थिर विधि में सौंपना है। बनाई जाने वाली वस्तु का निर्णय विधि के बाहर बनाई गई एब्सट्रैक्ट फैक्ट्री की तरह है (सामान्य स्थिति में, लेकिन हमेशा नहीं)। जबकि फैक्ट्री मेथड का मुख्य (!) विचार फैक्ट्री मेथड के अंदर बनाने के लिए क्लास के किस उदाहरण के निर्णय को सौंपना है। उदा। क्लासिक सिंगलटन कार्यान्वयन स्थैतिक फैक्टरी विधि का एक विशेष मामला है। आमतौर पर इस्तेमाल किए जाने वाले स्थिर कारखाने के तरीकों का उदाहरण:
स्थैतिक कारखाना विधियों द्वारा पठनीयता में सुधार किया जा सकता है:
तुलना
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();
private Foo(boolean withBar){/*..*/}
public static Foo createWithBar(){return new Foo(true);}
public static Foo createWithoutBar(){return new Foo(false);}
- कंस्ट्रक्टर्स के विपरीत नाम हैं, जो कोड को स्पष्ट कर सकते हैं।
- प्रत्येक आह्वान पर एक नई वस्तु बनाने की आवश्यकता नहीं है - यदि आवश्यक हो तो वस्तुओं को कैश और पुन: उपयोग किया जा सकता है।
- उनके रिटर्न प्रकार का एक उपप्रकार लौटा सकते हैं - विशेष रूप से, एक ऑब्जेक्ट वापस कर सकते हैं जिसका कार्यान्वयन वर्ग कॉलर से अज्ञात है। यह कई चौखटों में एक बहुत ही मूल्यवान और व्यापक रूप से उपयोग की जाने वाली विशेषता है जो इंटरफेस का उपयोग स्टैटिक फ़ैक्टरी विधियों के रिटर्न प्रकार के रूप में करते हैं।
यह सभी स्थिरता को बनाए रखता है। इसे लगाने का सबसे अच्छा तरीका है जब भी आप इसका उपयोग करेंnew
किसी ऑब्जेक्ट को बनाने के कीवर्ड का , तो आप उस कोड को युग्मित कर रहे हैं जिसे आप कार्यान्वयन के लिए लिख रहे हैं।
फ़ैक्टरी पैटर्न आपको अलग करता है कि आप ऑब्जेक्ट के साथ क्या करते हैं, उससे आप कैसे ऑब्जेक्ट बनाते हैं। जब आप कंस्ट्रक्टर का उपयोग करके अपने सभी ऑब्जेक्ट बनाते हैं, तो आप अनिवार्य रूप से उस कोड को हार्ड-वायरिंग करते हैं जो उस कार्यान्वयन के लिए ऑब्जेक्ट का उपयोग करता है। आपकी वस्तु का उपयोग करने वाला कोड "उस वस्तु पर" निर्भर है। यह सतह पर एक बड़ी बात की तरह प्रतीत नहीं हो सकता है, लेकिन जब वस्तु बदलती है (निर्माणकर्ता के हस्ताक्षर को बदलने के बारे में सोचें, या वस्तु को उप-वर्गित करते हुए) आपको हर जगह वापस जाना होगा और चीजों को फिर से बेचना होगा।
आज कारखानों को मोटे तौर पर निर्भरता इंजेक्शन के उपयोग के पक्ष में अलग कर दिया गया है क्योंकि उन्हें बहुत सारे बॉयलर-प्लेट कोड की आवश्यकता होती है जो खुद को बनाए रखने के लिए थोड़ा कठिन हो जाता है। निर्भरता इंजेक्शन मूल रूप से कारखानों के बराबर है लेकिन आपको यह निर्दिष्ट करने की अनुमति देता है कि आपकी वस्तुओं को एक साथ घोषित रूप से (कॉन्फ़िगरेशन या एनोटेशन के माध्यम से) वायर्ड कैसे किया जाता है।
यदि किसी वर्ग का निर्माता निजी है, तो आप उसके बाहर से कक्षा के लिए कोई ऑब्जेक्ट नहीं बना सकते।
class Test{
int x, y;
private Test(){
.......
.......
}
}
हम इसके बाहर से ऊपर की कक्षा के लिए कोई ऑब्जेक्ट नहीं बना सकते। इसलिए आप कक्षा के बाहर से x, y तक नहीं पहुँच सकते। फिर इस वर्ग का क्या उपयोग है?
यहाँ उत्तर है: फैक्टरी विधि।
उपरोक्त कक्षा में नीचे की विधि जोड़ें
public static Test getObject(){
return new Test();
}
तो अब आप इसके बाहर से इस वर्ग के लिए एक ऑब्जेक्ट बना सकते हैं। इस प्रकार...
Test t = Test.getObject();
इसलिए, एक स्थिर विधि जो अपने निजी कंस्ट्रक्टर को निष्पादित करके वर्ग की वस्तु को लौटाती है जिसे फैक्ट्री विधि कहा जाता है
।
Static Factory Method
सार्वजनिक निर्माणकर्ता का कोई लाभ है ?
मुझे लगा कि मैं इस पोस्ट पर कुछ प्रकाश डालूंगा जो मुझे पता है। हमने इस तकनीक का बड़े पैमाने पर इस्तेमाल किया recent android project
। के बजाय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)
विधि हमें दिखाता है, यह एक वस्तु कभी नहीं पैदा करता है। static factory methods
एक ही वस्तु को बार-बार लौटाने की क्षमताinvocations
कक्षाओं को किसी भी समय मौजूद उदाहरणों पर सख्त नियंत्रण बनाए रखने की अनुमति देती है।
Static factory methods
इसके विपरीत है constructors
, वे अपने object
किसी भी subtype
प्रकार की वापसी कर सकते हैं । इस लचीलेपन का एक अनुप्रयोग यह है कि एक एपीआई अपनी कक्षाओं को सार्वजनिक किए बिना वस्तुओं को वापस कर सकता है। इस तरह से कार्यान्वयन कक्षाएं छिपाने से एक बहुत ही कॉम्पैक्ट एपीआई बन जाता है।
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;
}
}
एक फैक्ट्री विधि एक ऐसी विधि है जो किसी वस्तु के तात्कालिकता को दूर करती है। आम तौर पर फैक्ट्रियां तब उपयोगी होती हैं जब आप जानते हैं कि आपको एक ऐसे वर्ग की एक नई मिसाल की आवश्यकता है जो कुछ इंटरफ़ेस को लागू करता है, लेकिन आप कार्यान्वयन वर्ग को नहीं जानते हैं।
संबंधित कक्षाओं की पदानुक्रमों के साथ काम करते समय यह उपयोगी है, इसका एक अच्छा उदाहरण GUI टूलकिट होगा। आप बस प्रत्येक विजेट के ठोस कार्यान्वयन के लिए कंस्ट्रक्टरों को हार्ड-कोड कॉल कर सकते हैं, लेकिन यदि आप कभी भी एक टूलकिट स्वैप करना चाहते थे तो आपके पास बदलने के लिए बहुत सारे स्थान होंगे। एक कारखाने का उपयोग करके आप कोड की मात्रा को कम करते हैं जिसे आपको बदलना होगा।
स्टेटिक फैक्ट्री से उपजे फायदे में से एक यह है कि एपीआई अपनी कक्षाओं को सार्वजनिक किए बिना वस्तुओं को वापस कर सकता है। यह बहुत कॉम्पैक्ट एपीआई की ओर जाता है। जावा में यह कलेक्शन क्लास द्वारा प्राप्त किया जाता है जो लगभग 32 वर्गों को छुपाता है जो इसे एपीआई को बहुत कॉम्पैक्ट बनाता है।
एक स्थिर फैक्टरी विधि अच्छी है जब आप यह सुनिश्चित करना चाहते हैं कि उपयोग किए जाने वाले ठोस वर्ग को वापस करने के लिए केवल एक ही उदाहरण है।
उदाहरण के लिए, एक डेटाबेस कनेक्शन वर्ग में, आप केवल एक ही वर्ग डेटाबेस कनेक्शन बनाना चाहते हैं, ताकि यदि आप मैसूर से ओरेकल में स्विच करने का निर्णय लेते हैं, तो आप केवल एक वर्ग में तर्क बदल सकते हैं, और शेष आवेदन करेंगे नए कनेक्शन का उपयोग करें।
यदि आप डेटाबेस पूलिंग को लागू करना चाहते हैं, तो वह भी बाकी एप्लिकेशन को प्रभावित किए बिना किया जाएगा।
यह शेष एप्लिकेशन को उन परिवर्तनों से बचाता है जो आप कारखाने में कर सकते हैं, जिसका उद्देश्य है।
इसके स्थिर होने का कारण यह है कि यदि आप कुछ सीमित संसाधन (सॉकेट कनेक्शन या फ़ाइल हैंडल की संख्या) का ट्रैक रखना चाहते हैं, तो यह वर्ग इस बात पर नज़र रख सकता है कि कितने पास हो चुके हैं और वापस आ गए हैं, इसलिए आप थकते नहीं हैं सीमित संसाधन।
निजी निर्माता के साथ स्थैतिक कारखाने के तरीकों में से एक लाभ (वस्तु निर्माण बाहरी वर्गों के लिए प्रतिबंधित होना चाहिए ताकि यह सुनिश्चित हो सके कि बाहरी रूप से निर्मित नहीं हैं) यह है कि आप उदाहरण-नियंत्रित कक्षाएं बना सकते हैं । और उदाहरण-नियंत्रित कक्षाएं गारंटी देती हैं कि आपके कार्यक्रम के दौरान कोई दो समान अलग-अलग उदाहरण मौजूद नहीं हैं ( a .equals (केवल a == b ) यदि चल रहा है, तो इसका मतलब है कि आप समान विधि के बजाय == ऑपरेटर के साथ वस्तुओं की समानता की जांच कर सकते हैं। , प्रभावी जावा के अनुसार।
स्टैटिक फैक्ट्री के तरीकों की क्षमता एक ही वस्तु को बार-बार इनवोकेशन से वापस करने की अनुमति देती है, जिससे कक्षाएं किसी भी समय मौजूद उदाहरणों पर सख्त नियंत्रण बनाए रख सकती हैं। ऐसा करने वाले वर्गों को उदाहरण-नियंत्रित कहा जाता है। उदाहरण-नियंत्रित कक्षाएं लिखने के कई कारण हैं। इंस्टेंस नियंत्रण एक वर्ग को यह गारंटी देता है कि यह एक सिंगलटन (आइटम 3) या गैर-परिवर्तनीय (आइटम 4) है। इसके अलावा, यह एक अपरिवर्तनीय वर्ग (आइटम 15) को यह गारंटी देता है कि कोई दो समान उदाहरण मौजूद नहीं हैं: a.equals (b) यदि और केवल अगर a == b। यदि कोई वर्ग यह गारंटी देता है, तो उसके ग्राहक बराबर (ऑब्जेक्ट) विधि के बजाय == ऑपरेटर का उपयोग कर सकते हैं, जिसके परिणामस्वरूप बेहतर प्रदर्शन हो सकता है। Enum प्रकार (आइटम 30) यह गारंटी प्रदान करते हैं।
प्रभावी जावा से, यहोशू बलोच (आइटम 1, पेज 6)
स्थिर
कीवर्ड 'स्थिर' के साथ घोषित सदस्य।
कारखाने के तरीके
नए ऑब्जेक्ट बनाने और वापस करने के तरीके।
जावा में
प्रोग्रामिंग भाषा 'स्थिर' के अर्थ के लिए प्रासंगिक है, लेकिन 'कारखाने' की परिभाषा के लिए नहीं।
जावा कार्यान्वयन में उपयोगिताओं में java.util.Arrays और java.util.Collections हैं। दोनों में स्थैतिक कारखाने के तरीके , इसके उदाहरण और उपयोग करने के तरीके शामिल हैं:
Arrays.asList("1","2","3")
Collections.synchronizedList(..), Collections.emptyList(), Collections.unmodifiableList(...)
(केवल कुछ उदाहरण, नैतिक विधियों के लिए javadocs की जाँच कर सकते हैं उदाहरण https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html )
इसके अलावा java.lang.String वर्ग के पास ऐसे स्थिर कारखाने हैं :
String.format(...), String.valueOf(..), String.copyValueOf(...)