
जावा मध्ये सिंगलटन म्हणजे काय?
सिंगलटन हा सर्वात सोपा वर्ग-स्तरीय डिझाइन नमुन्यांपैकी एक आहे. काहीवेळा लोक म्हणतात "हा वर्ग सिंगलटन आहे", ज्याचा अर्थ असा आहे की वर्ग सिंगलटन डिझाइन पॅटर्न लागू करतो. काहीवेळा एक वर्ग लिहिणे आवश्यक असते जेथे आम्ही एकाच ऑब्जेक्टवर इन्स्टंटेशन प्रतिबंधित करतो. उदाहरणार्थ, लॉगिंग किंवा कनेक्ट करण्यासाठी जबाबदार वर्ग डेटाबेस. सिंगलटन डिझाइन पॅटर्न हे आम्ही कसे साध्य करू शकतो याचे वर्णन करतो. सिंगलटन हा एक डिझाइन पॅटर्न आहे जो दोन गोष्टी करतो:-
हे हमी देते की वर्गाचा फक्त एकच प्रसंग असेल.
-
हे त्या उदाहरणासाठी जागतिक प्रवेशाचा एकल बिंदू प्रदान करते.
-
खाजगी बांधकाम करणारा. हे वर्गाच्या बाहेरील वस्तू तयार करण्याची क्षमता मर्यादित करते.
-
एक सार्वजनिक स्थिर पद्धत जी वर्गाचे उदाहरण परत करते. या पद्धतीला getInstance म्हणतात . हा वर्ग उदाहरणासाठी जागतिक प्रवेशाचा मुद्दा आहे.
अंमलबजावणी पर्याय
सिंगलटन डिझाइन पॅटर्न विविध प्रकारे लागू केला जातो. प्रत्येक पर्याय त्याच्या स्वत: च्या मार्गाने चांगला आणि वाईट आहे. नेहमीप्रमाणे, येथे कोणताही परिपूर्ण पर्याय नाही, परंतु आपण एकासाठी प्रयत्न केला पाहिजे. सर्वप्रथम, चांगलं आणि वाईट काय आहे हे ठरवू या आणि डिझाइन पॅटर्नच्या विविध अंमलबजावणीचे आम्ही कसे मूल्यांकन करतो यावर कोणते मेट्रिक्स परिणाम करतात. चला चांगल्यापासून सुरुवात करूया. अंमलबजावणीला अधिक रसाळ आणि आकर्षक बनवणारे घटक येथे आहेत:-
आळशी आरंभीकरण: आवश्यकतेपर्यंत उदाहरण तयार केले जात नाही.
-
साधा आणि पारदर्शक कोड: हा मेट्रिक अर्थातच व्यक्तिनिष्ठ आहे, पण तो महत्त्वाचा आहे.
-
थ्रेड सुरक्षा: मल्टी-थ्रेडेड वातावरणात योग्य ऑपरेशन.
-
मल्टी-थ्रेडेड वातावरणात उच्च कार्यप्रदर्शन: संसाधन सामायिक करताना थोडे किंवा कोणतेही थ्रेड अवरोधित करणे.
-
आळशी आरंभीकरण नाही: जेव्हा अनुप्रयोग सुरू होतो तेव्हा वर्ग लोड केला जातो, त्याची गरज आहे की नाही याची पर्वा न करता (विरोधाभास म्हणजे, आयटी जगात आळशी असणे चांगले आहे)
-
क्लिष्ट आणि वाचण्यास कठीण कोड. हे मेट्रिक देखील व्यक्तिनिष्ठ आहे. तुमच्या डोळ्यातून रक्तस्राव सुरू झाल्यास, आम्ही असे गृहीत धरू की अंमलबजावणी सर्वोत्तम नाही.
-
धाग्याच्या सुरक्षिततेचा अभाव. दुसऱ्या शब्दांत, "थ्रेड डेंजर". मल्टी-थ्रेडेड वातावरणात चुकीचे ऑपरेशन.
-
मल्टी-थ्रेडेड वातावरणात खराब कार्यप्रदर्शन: संसाधन सामायिक करताना थ्रेड्स एकमेकांना नेहमीच अवरोधित करतात.
कोड
आता आम्ही विविध अंमलबजावणी पर्यायांचा विचार करण्यास आणि साधक आणि बाधक सूचित करण्यास तयार आहोत:सोपे
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return INSTANCE;
}
}
सर्वात सोपी अंमलबजावणी. साधक:
-
साधा आणि पारदर्शक कोड
-
धाग्याची सुरक्षा
-
मल्टी-थ्रेडेड वातावरणात उच्च कार्यक्षमता
- आळशी आरंभ नाही.
आळशी आरंभ
public class Singleton {
private static final Singleton INSTANCE;
private Singleton() {}
public static Singleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
साधक:
-
आळशी आरंभ.
-
धागा सुरक्षित नाही
सिंक्रोनाइझ केलेला प्रवेश
public class Singleton {
private static final Singleton INSTANCE;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
साधक:
-
आळशी आरंभ.
-
धाग्याची सुरक्षा
-
खराब मल्टीथ्रेड कामगिरी
डबल-चेक केलेले लॉकिंग
public class Singleton {
private static final Singleton INSTANCE;
private Singleton() {
}
public static Singleton getInstance() {
if (INSTANCE == null) {
synchronized (Singleton.class) {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
}
}
return INSTANCE;
}
}
साधक:
-
आळशी आरंभ.
-
धाग्याची सुरक्षा
-
मल्टी-थ्रेडेड वातावरणात उच्च कार्यक्षमता
-
Java च्या आधीच्या 1.5 च्या आवृत्त्यांमध्ये समर्थित नाही (1.5 आवृत्ती पासून अस्थिर कीवर्डचा वापर निश्चित आहे)
वर्ग धारक
public class Singleton {
private Singleton() {
}
private static class SingletonHolder {
public static final Singleton HOLDER_INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.HOLDER_INSTANCE;
}
}
साधक:
-
आळशी आरंभ.
-
धाग्याची सुरक्षा.
-
मल्टी-थ्रेडेड वातावरणात उच्च कार्यक्षमता.
-
योग्य ऑपरेशनसाठी हमी आवश्यक आहे की सिंगलटन ऑब्जेक्ट त्रुटींशिवाय प्रारंभ केला जाईल. अन्यथा, getInstance पद्धतीच्या पहिल्या कॉलचा परिणाम ExceptionInInitializerError होईल , आणि त्यानंतरचे सर्व कॉल NoClassDefFoundError तयार करतील .
अंमलबजावणी | आळशी आरंभ | धाग्याची सुरक्षा | मल्टीथ्रेड कामगिरी | कधी वापरायचे? |
---|---|---|---|---|
सोपे | - | + | जलद | कधीच नाही. किंवा शक्यतो जेव्हा आळशी आरंभ करणे महत्वाचे नसते. पण कधीही चांगले होणार नाही. |
आळशी आरंभ | + | - | लागू नाही | नेहमी जेव्हा मल्टीथ्रेडिंगची आवश्यकता नसते |
सिंक्रोनाइझ केलेला प्रवेश | + | + | मंद | कधीच नाही. किंवा शक्यतो जेव्हा मल्टीथ्रेडेड कामगिरी काही फरक पडत नाही. पण कधीही चांगले होणार नाही. |
डबल-चेक केलेले लॉकिंग | + | + | जलद | क्वचित प्रसंगी जेव्हा तुम्हाला सिंगलटन तयार करताना अपवाद हाताळावे लागतात (जेव्हा वर्गधारक सिंगलटन लागू होत नाही) |
वर्ग धारक | + | + | जलद | जेव्हा जेव्हा मल्टीथ्रेडिंगची आवश्यकता असते आणि एक हमी असते की सिंगलटन ऑब्जेक्ट समस्यांशिवाय तयार केला जाईल. |
सिंगलटन पॅटर्नचे फायदे आणि तोटे
सर्वसाधारणपणे, सिंगलटन त्याच्याकडून जे अपेक्षित आहे तेच करतो:-
हे हमी देते की वर्गाचा फक्त एकच प्रसंग असेल.
-
हे त्या उदाहरणासाठी जागतिक प्रवेशाचा एकल बिंदू प्रदान करते.
-
सिंगलटन एकल जबाबदारीच्या तत्त्वाचे उल्लंघन करते: त्याच्या थेट कर्तव्यांव्यतिरिक्त, सिंगलटन वर्ग घटनांच्या संख्येवर देखील नियंत्रण ठेवतो.
-
एका सामान्य वर्गाचे सिंगलटनवर अवलंबून असणे वर्गाच्या सार्वजनिक करारामध्ये दिसत नाही.
-
ग्लोबल व्हेरिएबल्स वाईट आहेत. सरतेशेवटी, सिंगलटन हे मोठ्या जागतिक व्हेरिएबलमध्ये बदलते.
-
सिंगलटनची उपस्थिती संपूर्णपणे अनुप्रयोगाची चाचणीक्षमता आणि विशेषतः सिंगलटन वापरणारे वर्ग कमी करते.
GO TO FULL VERSION