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


261

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


एक वैकल्पिक स्टेटिक फ़ैक्टरी विधियां निर्भरता इंजेक्शन का उपयोग कर रही हैं।
CMCDragonkai

1
@ थंगफैम जेसन ओवेन का जवाब त्रुटिपूर्ण है क्योंकि यह फैक्ट्री मेथड पैटर्न के बारे में बात करने के लिए है, जो कि स्टैटिक फैक्ट्री मेथड पैटर्न से बहुत अलग है जिसके बारे में यह वास्तव में बात करता है। इसलिए, जबकि यह वास्तविक प्रश्न का उत्तर देने का एक अच्छा काम करता है, मुझे नहीं लगता कि इसे इसकी वर्तमान स्थिति में स्वीकार किया जा सकता है, क्योंकि यह एक असंबंधित पैटर्न में लाता है और दो पैटर्न के बीच अंतर के बारे में पहले से ही अविश्वसनीय रूप से आम भ्रम को बढ़ाता है।
थियोडोर मर्डॉक

@CMCDragonkai मुझे लगता है कि निर्भरता इंजेक्शन और स्थिर कारखाने अलग हैं। इंजेक्शन लगाने के लिए तात्कालिक निर्भरता के लिए निर्भरता इंजेक्शन के मामले में भी स्थैतिक कारखाने की आवश्यकता हो सकती है।
करण खन्ना

जवाबों:


126

हम डेटाबेस कनेक्शन तक सीधी पहुँच प्रदान करने से बचते हैं क्योंकि वे संसाधन गहन हैं। इसलिए हम एक स्थिर फैक्ट्री विधि का उपयोग 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);
     //...
   }
}

अगर मैं सही समझता हूं, तो क्या आप उपलब्ध रिटर्न जोड़ सकते हैं। विधि (डीबी) रिटर्न के लिए विधि डिबनेक्शन (डीबीसीएनक्शन डीबी)?
हाइफ़ेंग जांग

@ शैफज़ान, यह वास्तव में पूरा होने का इरादा नहीं है, लेकिन ठीक है।
मैथ्यू फ्लैशेन

@ मैथ्यूफ्लैशचेन को भी कुल कनेक्शन में कटौती करनी चाहिए जबकि कनेक्शन वापस आ गया है?
रोलिंग स्टोन

@ श्रीधर, नहीं, यह उन कनेक्शनों की संख्या है जो मौजूद हैं (ट्रैक किया गया है ताकि MAX_CONNS से ​​अधिक न बने हों), वह संख्या नहीं जो घूम रही है।
मैथ्यू फ्लेशेन

यदि DbConnection क्लोजेबल है तो @MatthewFlaschen आपको ब्लॉक-बग के रूप में सोनारक्यूब द्वारा पकड़ा जाएगा।
आनन बीरू

477

स्थिर कारखाने विधि पैटर्न 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)

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


32
ध्यान दें कि एक स्टैटिक फ़ैक्टरी विधि डिज़ाइन पैटर्न से फैक्ट्री मेथड पैटर्न के समान नहीं है [Gamma95, p। 107]। इस मद में वर्णित स्थिर कारखाना विधि का डिज़ाइन पैटर्न में कोई सीधा समकक्ष नहीं है।
जोश सनशाइन

इस जवाब पर मेरे लिए अदायगी पूल करने योग्य वस्तुओं का संदर्भ है। यह वास्तव में है कि मैं कारखाने विधि पैटर्न का उपयोग कैसे कर रहा हूं। किसी वस्तु के जीवनचक्र को नियंत्रित करने में मदद करने के लिए फ़ैक्टरी विधियाँ प्रदान की जाती हैं: "बनाएँ" या तो पूल से एक वस्तु खींचती है या एक नया उदाहरण बनाती है यदि पूल खाली है, तो "नष्ट करें" इसे भविष्य के पुन: उपयोग के लिए पूल में लौटाता है।
मंटेंटेनु

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

8
मैं @TheodoreMurdock से सहमत हूं। आप गलत शब्द का उपयोग कर रहे हैं। आप जोशुआ बलोच के "स्टेटिक फैक्ट्री मेथड" के बारे में बात कर रहे हैं, लेकिन आप गोफ के "फैक्ट्री मेथड पैटर्न" शब्द का उपयोग करते हैं। कृपया इसे अन्य लोगों को गलत समझने के लिए संपादित न करें।
पन्नाधाय

1
ध्यान दें कि कंस्ट्रक्टर को निजी नहीं होना चाहिए। एक वर्ग सार्वजनिक स्थैतिक कारखाने के तरीके और निर्माता दोनों प्रदान कर सकता है।
केविन

171

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

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

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

अंतर:

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

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

क्या आप मुझे नए A () और A.newInstance () के बीच अंतर बता सकते हैं? और A.newInstance के अंदर हमें क्या करना चाहिए?
शेन

69

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

तुलना

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();

इसलिए मैंने आपको उदाहरण लागू करने की कोशिश की लेकिन मुझे यकीन नहीं है कि यह कैसे काम करता है। दो तरीकों से बनाएं। विथबर्गर और क्रिएटिविटरबाउर को फू कक्षा के अंदर 2 निजी कंस्ट्रक्टरों को बुलाना चाहिए?
एस्सेज

@ बैक्सटेक्स: हाँ। प्रत्येक एक निजी निर्माता को बुलाएगा। शायद सिर्फ एक ही:private Foo(boolean withBar){/*..*/} public static Foo createWithBar(){return new Foo(true);} public static Foo createWithoutBar(){return new Foo(false);}
रासमस फेबर

मुझे लगता है कि यह "स्केल" बहुत अच्छी तरह से नहीं है। यदि आपके पास तीन या अधिक पैरामीटर हैं, तो आप इस विचार का उपयोग कैसे कर सकते हैं और विधि के लिए एक अच्छा नाम बना सकते हैं?
Dherik

@Dherik: तब आपको संभवतः बिल्डर पैटर्न का उपयोग करना चाहिए: नए FooBuilder ()। WithBar ()। WithoutFoo ()। WithBaz ()। Build ()।
रासमस फेबर

21
  • कंस्ट्रक्टर्स के विपरीत नाम हैं, जो कोड को स्पष्ट कर सकते हैं।
  • प्रत्येक आह्वान पर एक नई वस्तु बनाने की आवश्यकता नहीं है - यदि आवश्यक हो तो वस्तुओं को कैश और पुन: उपयोग किया जा सकता है।
  • उनके रिटर्न प्रकार का एक उपप्रकार लौटा सकते हैं - विशेष रूप से, एक ऑब्जेक्ट वापस कर सकते हैं जिसका कार्यान्वयन वर्ग कॉलर से अज्ञात है। यह कई चौखटों में एक बहुत ही मूल्यवान और व्यापक रूप से उपयोग की जाने वाली विशेषता है जो इंटरफेस का उपयोग स्टैटिक फ़ैक्टरी विधियों के रिटर्न प्रकार के रूप में करते हैं।

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


18

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

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

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


3
क्या आप कह रहे हैं कि कारखानों को खैरात की जरूरत है? ;)
जॉन फैरेल

4
Haha! इस दिन और उम्र में मुझे लगता है कि हम सब एक खैरात ... :) इस्तेमाल कर सकते हैं
cwash

11

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

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

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

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

तो अब आप इसके बाहर से इस वर्ग के लिए एक ऑब्जेक्ट बना सकते हैं। इस प्रकार...

Test t = Test.getObject();

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


1
आप इसे "समाधान" क्यों कहते हैं? निजी कंस्ट्रक्टर की घोषणा करना "समस्या" नहीं है, यह एक डिज़ाइन पैटर्न है।
ओजोनुगवा जूड ओचलिफु

1
अपडेट किया गया। वैसे भी धन्यवाद
संतोष

हाय @ संतोष मेरे पास एक चिंता का विषय है कि आप निजी निर्माणकर्ता को सार्वजनिक क्यों नहीं करते? यदि आप उपवर्ग बनाना नहीं चाहते हैं, तो यह मेरे लिए ठीक है, लेकिन अगर मेरा निजी निर्माण करने का इरादा नहीं है, तो क्या हमें Static Factory Methodसार्वजनिक निर्माणकर्ता का कोई लाभ है ?
शेन

9

मुझे लगा कि मैं इस पोस्ट पर कुछ प्रकाश डालूंगा जो मुझे पता है। हमने इस तकनीक का बड़े पैमाने पर इस्तेमाल किया 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;
    }
}

4

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

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


यह मानकर कि आपके कारखाने में एक इंटरफ़ेस प्रकार है, न कि आप जिस ठोस वर्ग के साथ काम कर रहे हैं।
बिल लिंच

1
यह उत्तर फैक्ट्री विधि डिजाइन पैटर्न के बारे में है न कि स्टैटिक फैक्ट्री के तरीके। एक स्थिर कारखाने के तरीके बस एक सार्वजनिक स्थैतिक विधि है जो एक वर्ग का एक उदाहरण देता है। आगे विस्तार के लिए प्रभावी जावा के अध्याय 2 देखें।
जोश सनशाइन

4

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


2

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

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

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

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

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


2

निजी निर्माता के साथ स्थैतिक कारखाने के तरीकों में से एक लाभ (वस्तु निर्माण बाहरी वर्गों के लिए प्रतिबंधित होना चाहिए ताकि यह सुनिश्चित हो सके कि बाहरी रूप से निर्मित नहीं हैं) यह है कि आप उदाहरण-नियंत्रित कक्षाएं बना सकते हैं । और उदाहरण-नियंत्रित कक्षाएं गारंटी देती हैं कि आपके कार्यक्रम के दौरान कोई दो समान अलग-अलग उदाहरण मौजूद नहीं हैं ( a .equals (केवल a == b ) यदि चल रहा है, तो इसका मतलब है कि आप समान विधि के बजाय == ऑपरेटर के साथ वस्तुओं की समानता की जांच कर सकते हैं। , प्रभावी जावा के अनुसार।

स्टैटिक फैक्ट्री के तरीकों की क्षमता एक ही वस्तु को बार-बार इनवोकेशन से वापस करने की अनुमति देती है, जिससे कक्षाएं किसी भी समय मौजूद उदाहरणों पर सख्त नियंत्रण बनाए रख सकती हैं। ऐसा करने वाले वर्गों को उदाहरण-नियंत्रित कहा जाता है। उदाहरण-नियंत्रित कक्षाएं लिखने के कई कारण हैं। इंस्टेंस नियंत्रण एक वर्ग को यह गारंटी देता है कि यह एक सिंगलटन (आइटम 3) या गैर-परिवर्तनीय (आइटम 4) है। इसके अलावा, यह एक अपरिवर्तनीय वर्ग (आइटम 15) को यह गारंटी देता है कि कोई दो समान उदाहरण मौजूद नहीं हैं: a.equals (b) यदि और केवल अगर a == b। यदि कोई वर्ग यह गारंटी देता है, तो उसके ग्राहक बराबर (ऑब्जेक्ट) विधि के बजाय == ऑपरेटर का उपयोग कर सकते हैं, जिसके परिणामस्वरूप बेहतर प्रदर्शन हो सकता है। Enum प्रकार (आइटम 30) यह गारंटी प्रदान करते हैं।

प्रभावी जावा से, यहोशू बलोच (आइटम 1, पेज 6)


1

स्थिर

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

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

नए ऑब्जेक्ट बनाने और वापस करने के तरीके।

जावा में

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


@ विक्टर जवाबों में तर्क सम्‍मिलित करने की आवश्‍यकता नहीं है। तथ्य पर्याप्त होना चाहिए: यदि विवादास्पद है, तो उन्हें तर्क या प्रशस्ति पत्र द्वारा समर्थित किया जा सकता है। मुझे नहीं पता कि यहां कुछ भी विवादास्पद है।
लोर्ने

मैंने कहा कि क्योंकि उत्तर बहुत छोटा था और वास्तव में पहले, दूसरे और तीसरे रूप में अच्छी तरह से समझ में नहीं आया, वैसे भी ओपी से पूछना है। कोई बात नहीं, मैंने अपना दिमाग बदल दिया है और नीचे की ओर हटाने की कोशिश करता हूं, लेकिन मैं नहीं कर सकता।
विक्टर

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

बेशक व्यक्तिपरक है ... सभी स्टैकओवरफ़्लो उत्तर व्यक्तिपरक हैं, वास्तव में वे लेखक के ज्ञान के स्तर से संबंधित हैं और जवाब देने के लिए। मैं वास्तव में आपके उत्तर को नहीं समझता, शायद यह छोटा था।
विक्टर

@ विक्टर बकवास। तथ्य के मामले व्यक्तिपरक नहीं होते हैं, और न ही ऐसे मामले होते हैं जिन्हें तथ्यों या स्वयंसिद्ध शब्दों से व्युत्पन्न किया जा सकता है। दूसरी ओर 'टू शॉर्ट' व्यक्तिपरक है, और मैंने पहले ही इसे संबोधित किया है। यह उत्तर मूल रूप से इस एक के समान है , जिस पर आपने कोई टिप्पणी नहीं की है। आपकी टिप्पणियाँ अस्पष्ट रहती हैं।
लोर्ने का मार्किव

1

जावा कार्यान्वयन में उपयोगिताओं में 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(...)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.