सबसे पहले, जावा-लिट में आपकी पसंद के लिए आपको कुडोस: ब्लोच की पुस्तक उत्कृष्ट प्राइमर है।
अपने दूसरे प्रश्न का उत्तर देने के लिए ('रचनाकारों के विपरीत स्थिर फैक्ट्री विधियों को हर बार एक नई वस्तु बनाने की आवश्यकता नहीं होती है'), यह जानना महत्वपूर्ण है कि ब्लॉच कह रहा है कि आपके पास एक स्थिर कारखाने के साथ विकल्प या तो: एक नई वस्तु लौटाना या पूर्व-मौजूदा एक लौटाना। यह सब उस चीज पर निर्भर करता है जो आप करना चाहते हैं।
उदाहरण के लिए, मान लीजिए कि आपके पास मनी का एक बहुत ही सरल मूल्य वर्ग है। आपकी स्थैतिक फैक्ट्री विधि को शायद एक नया उदाहरण वापस करना चाहिए - यानी, पैसे के लिए एक विशिष्ट मूल्य वाला एक नया ऑब्जेक्ट। तो, इस तरह:
public class Money {
private Money(String amount) { ... } /* Note the 'private'-constructor */
public static Money newInstance(String amount) {
return new Money(amount);
}
}
लेकिन मान लीजिए कि आप किसी वस्तु है कि कुछ संसाधन प्रबंधन करता है और आप कुछ संसाधनप्रबंधक श्रेणी के माध्यम से है कि संसाधन के लिए उपयोग सिंक्रनाइज़ करने के लिए चाहते हैं। उस स्थिति में आप शायद अपनी स्थैतिक फैक्ट्री विधि को सभी के लिए एक ही उदाहरण वापस करने के लिए चाहते हैं - हर किसी को उसी उदाहरण के माध्यम से जाने के लिए मजबूर करना, ताकि वह 1 उदाहरण प्रक्रिया को नियंत्रित कर सके। यह सिंगलटन-पैटर्न का पालन करता है। कुछ इस तरह:
public ResourceManager {
private final static ResourceManager me = new ResourceManager();
private ResourceManager() { ... } /* Note the 'private'-constructor */
public static ResourceManager getSingleton() {
return ResourceManager.me;
}
}
उपरोक्त विधि करने के लिए अपने उपयोगकर्ता मजबूर करता ही कभी, एक उदाहरण का उपयोग कर सकेंगे आप ठीक नियंत्रित करने के लिए जो (और जब) जो कुछ भी यह है कि आप प्रबंधन कर रहे हैं की पहुंच है की इजाजत दी।
अपने पहले सवाल का जवाब करने के लिए, इस पर विचार करें (वैसे नहीं सबसे अच्छा उदाहरण, यह बहुत तदर्थ है):
public class Money {
private Money(String amount) { ... }
public static Money getLocalizedMoney(MoneyType localizedMoneyType, String amount) {
switch(localizedMoneyType) {
case MoneyType.US:
return new Money_US(amount);
case MoneyType.BR:
return new Money_BR(amount);
default:
return new Money_US(amount);
}
}
}
public class Money_US extends Money { ... }
public class Money_BR extends Money { ... }
नोट मैं कैसे अब यह कर सकते हैं:
Money money = Money.getLocalizedMoney(user_selected_money_type);
saveLocalizedMoney(money);
फिर, एक वास्तव में योगदान हुआ उदाहरण है लेकिन उम्मीद है कि इससे आपको उस बिंदु के साथ ब्लोच मिल रहा था या उससे कम या कम देखने में मदद करता है।
अन्य उत्तरों अच्छे थे - मुझे लगता है कि, शुरुआत के रूप में, कभी-कभी यह कुछ वास्तविक कोड देखने में मदद करता है।
सॉफ़्टवेयर डिज़ाइन अभ्यास में गहरे डाइविंग के लिए +1 और एक अच्छा प्रश्न पूछना। –
धन्यवाद ब्रायन :) – t0mcat
+1 लिखने के बजाय क्यों लिखने के बजाय प्रोग्रामिंग करने के बजाय। एक अच्छा कोडर की आदत। – TreyE