पिछले कुछ महीनों में, मैंने निम्नलिखित तकनीक / पैटर्न पर कुछ बार ठोकर खाई। हालाँकि, मुझे कोई विशिष्ट नाम नहीं मिल रहा है, और न ही मैं इसके सभी फायदे और नुकसान के बारे में 100% निश्चित हूं।
पैटर्न निम्नानुसार है:
जावा इंटरफ़ेस के भीतर, सामान्य तरीकों के एक सेट को हमेशा की तरह परिभाषित किया गया है। हालांकि, एक आंतरिक वर्ग का उपयोग करते हुए, एक डिफ़ॉल्ट उदाहरण इंटरफ़ेस के माध्यम से लीक हो जाता है।
public interface Vehicle {
public void accelerate();
public void decelerate();
public static class Default {
public static Vehicle getInstance() {
return new Car(); // or use Spring to retrieve an instance
}
}
}
मेरे लिए, ऐसा लगता है कि सबसे बड़ा फायदा इस तथ्य में निहित है कि एक डेवलपर को केवल इंटरफ़ेस के बारे में जानने की जरूरत है, न कि इसके कार्यान्वयन की, जैसे कि वह जल्दी से एक उदाहरण बनाना चाहता है।
Vehicle someVehicle = Vehicle.Default.getInstance();
someVehicle.accelerate();
इसके अलावा, मैंने इस तकनीक को कॉन्फ़िगरेशन के आधार पर गतिशील रूप से उदाहरण प्रदान करने के लिए स्प्रिंग के साथ एक साथ उपयोग किया जा रहा है। इस संबंध में, यह भी दिखता है कि यह संशोधन के साथ मदद कर सकता है।
फिर भी, मैं यह महसूस नहीं कर सकता कि यह इंटरफ़ेस का दुरुपयोग है क्योंकि यह इंटरफ़ेस को इसके कार्यान्वयन के साथ जोड़ देता है। (निर्भरता उलटा सिद्धांत आदि ..) क्या कोई मुझे बता सकता है कि इस तकनीक को कैसे कहा जाता है, साथ ही इसके फायदे और नुकसान?
अद्यतन करें:
विचार के लिए कुछ समय बाद, मैंने पुनः जाँच की और देखा कि पैटर्न के निम्नलिखित सिंगलटन संस्करण का उपयोग कहीं अधिक बार किया गया था। इस संस्करण में, एक सार्वजनिक स्थिर उदाहरण को इंटरफ़ेस के माध्यम से उजागर किया जाता है जिसे केवल एक बार प्रारंभ किया जाता है (क्षेत्र अंतिम होने के कारण)। इसके अलावा, स्प्रिंग या जेनेरिक फैक्ट्री का उपयोग करते हुए उदाहरण को लगभग हमेशा पुनर्प्राप्त किया जाता है जो कार्यान्वयन से इंटरफ़ेस को डिकूप करता है।
public interface Vehicle {
public void accelerate();
public void decelerate();
public static class Default {
public static final Vehicle INSTANCE = getInstance();
private static Vehicle getInstance() {
return new Car(); // or use Spring/factory here
}
}
}
// Which allows to retrieve a singleton instance using...
Vehicle someVehicle = Vehicle.Default.INSTANCE;
संक्षेप में: ऐसा लगता है कि यह एक कस्टम सिंगलटन / फैक्ट्री पैटर्न है, जो मूल रूप से एक उदाहरण या एक सिंगलटन को अपने इंटरफेस के माध्यम से उजागर करने की अनुमति देता है। नुकसान के संबंध में, कुछ का नाम और जवाब नीचे टिप्पणी में दिया गया है। अब तक, लाभ अपनी सुविधा में झूठ लगता है।
Vehicle.Default
एक कारखाने वर्ग के रूप में पैकेज नाम स्थान में ऊपर ले जाया जाना चाहिए, जैसे VehicleFactory
।
Vehicle.Default.getInstance() != Vehicle.Default.getInstance()