मेरे पास एक लाइब्रेरी है जो यूआरएल का विश्लेषण करती है और कुछ डेटा निकालती है। प्रति यूआरएल एक वर्ग है। यह जानने के लिए कि किस वर्ग को उपयोगकर्ता द्वारा प्रदान किए गए यूआरएल को संभालना चाहिए, मेरे पास नीचे कोड है।गतिशील रूप से एक कारखाने में सही कार्यान्वयन का आह्वान
public class HostExtractorFactory {
private HostExtractorFactory() {
}
public static HostExtractor getHostExtractor(URL url)
throws URLNotSupportedException {
String host = url.getHost();
switch (host) {
case HostExtractorABC.HOST_NAME:
return HostExtractorAbc.getInstance();
case HostExtractorDEF.HOST_NAME:
return HostExtractorDef.getInstance();
case HostExtractorGHI.HOST_NAME:
return HostExtractorGhi.getInstance();
default:
throw new URLNotSupportedException(
"The url provided does not have a corresponding HostExtractor: ["
+ host + "]");
}
}
}
समस्या उन अधिक यूआरएल अनुरोध कर रहे हैं पार्स किया जा सकता है, मेरे स्विच बयान से बढ़ रहा है जिसका मतलब है कि है। प्रत्येक बार जब कोई पार्सर के साथ आता है, तो मुझे इसे शामिल करने के लिए अपने कोड को संशोधित करना होगा।
इसे समाप्त करने के लिए, मैंने एक नक्शा बनाने और उन्हें बेनकाब करने का निर्णय लिया है, ताकि जब उनकी कक्षा लिखी जाए, तो वे मेजबान नाम प्रदान करके कारखाने में खुद को पंजीकृत कर सकते हैं, और फैक्ट्री के निकालने वाले । इस विचार के साथ कारखाना नीचे लागू किया गया है।
public class HostExtractorFactory {
private static final Map<String, HostExtractor> EXTRACTOR_MAPPING = new HashMap<>();
private HostExtractorFactory() {
}
public static HostExtractor getHostExtractor(URL url)
throws URLNotSupportedException {
String host = url.getHost();
if(EXTRACTOR_MAPPING.containsKey(host)) {
return EXTRACTOR_MAPPING.get(host);
} else {
throw new URLNotSupportedException(
"The url provided does not have a corresponding HostExtractor: ["
+ host + "]");
}
}
public static void register(String hostname, HostExtractor extractor) {
if(StringUtils.isBlank(hostname) == false && extractor != null) {
EXTRACTOR_MAPPING.put(hostname, extractor);
}
}
}
और उपयोगकर्ता इसे उस तरह से प्रयोग करेंगे:
public class HostExtractorABC extends HostExtractor {
public final static String HOST_NAME = "www.abc.com";
private static class HostPageExtractorLoader {
private static final HostExtractorABC INSTANCE = new HostExtractorABC();
}
private HostExtractorABC() {
if (HostPageExtractorLoader.INSTANCE != null) {
throw new IllegalStateException("Already instantiated");
}
HostExtractorFactory.register(HOST_NAME, this);
}
public static HostExtractorABC getInstance() {
return HostPageExtractorLoader.INSTANCE;
}
...
}
मैं अपने ही पीठ थपथपा रहा था जब मुझे एहसास हुआ कि यह काम कभी नहीं होगा: उपयोगकर्ता कक्षाएं जब मैं यूआरएल प्राप्त करता हूं, तो केवल लोड नहीं होता है, जिसका मतलब है कि उनका कन्स्ट्रक्टर कभी नहीं चलता है, और नक्शा हमेशा खाली रहता है। तो मैं ड्रॉइंग बोर्ड पर वापस आ गया हूं, लेकिन इस काम को पाने के लिए कुछ विचार या इस अजीब स्विच स्टेटमेंट से छुटकारा पाने के लिए एक और दृष्टिकोण चाहूंगा।
एस
आप ** प्रतिबिंब ** का उपयोग कर सकते हैं या आपको कहीं भी ज्ञात या "उपलब्ध होना चाहता था" वर्गों को सूचीबद्ध करना होगा, उदा। एक विन्यास फाइल ... उदा। 'org.reflections' वर्ग पथ स्कैन करने के लिए एक अच्छा हल्के lib है। – dedek
कक्षा के नामों को एक साधारण पाठ फ़ाइल में सूचीबद्ध करें जो वे स्वयं को बनाए रख सकते हैं, फ़ैक्टरी निर्माण को एक स्थिर कंस्ट्रक्टर में ले जाएं और सभी प्रविष्टियों पर 'class.forname' (https://stackoverflow.com/q/8100376/13075) का उपयोग करें एक फैक्टरी प्रारंभिक विधि में फ़ाइल का। – Henrik
वैकल्पिक रूप से: एक एनोटेशन पेश करें जो वे अपनी कक्षाओं पर लागू होते हैं, और कारखाने में उस के लिए कक्षा के पथ को स्कैन करते हैं। – Henrik