سنگلٽن ڇا آهي؟
سنگلٽن ھڪڙو آسان ترين نمونو آھي جيڪو ھڪڙي طبقي تي لاڳو ڪري سگھجي ٿو. ماڻهو ڪڏهن ڪڏهن چوندا آهن ته ”هي ڪلاس سنگلٽن آهي،“ مطلب ته هي طبقو سنگلٽن ڊيزائن جو نمونو لاڳو ڪري ٿو. ڪڏهن ڪڏهن اهو ضروري آهي ته هڪ ڪلاس لکڻ لاء، جنهن لاء صرف هڪ اعتراض ٺاهي سگهجي ٿو. مثال طور، هڪ طبقي جو ذميوار آهي لاگنگ يا ڊيٽابيس سان ڳنڍڻ. سنگلٽن ڊيزائن جو نمونو بيان ڪري ٿو ته اسان اهڙي ڪم کي ڪيئن پورو ڪري سگهون ٿا. سنگلٽن هڪ ڊزائن جو نمونو آهي جيڪو ٻه شيون ڪري ٿو:-
هڪ گارنٽي فراهم ڪري ٿي ته هڪ ڪلاس ۾ صرف هڪ ڪلاس جو مثال هوندو.
-
ھن ڪلاس جي ھڪڙي مثال کي عالمي رسائي پوائنٽ مهيا ڪري ٿي.
-
ذاتي تعمير ڪندڙ. ڪلاس کان ٻاهر طبقاتي شيون ٺاهڻ جي صلاحيت کي محدود ڪري ٿو.
-
ھڪڙو عوامي جامد طريقو جيڪو ڪلاس جو ھڪڙو مثال ڏئي ٿو. اهو طريقو سڏيو ويندو آهي
getInstance
. هي ڪلاس مثال جي عالمي رسائي پوائنٽ آهي.
لاڳو ڪرڻ جا اختيار
سنگلٽن ڊيزائن جو نمونو مختلف طريقن سان استعمال ٿيندو آهي. هر اختيار پنهنجي طريقي سان سٺو ۽ خراب آهي. هتي، هميشه وانگر: ڪو به مثالي نه آهي، پر توهان کي ان لاء ڪوشش ڪرڻ جي ضرورت آهي. پر سڀ کان پهريان، اچو ته وضاحت ڪريون ته ڇا سٺو آهي ۽ ڇا خراب آهي، ۽ ڪهڙي ميٽرڪ ڊزائن جي نموني جي عمل جي تشخيص تي اثر انداز ڪن ٿا. اچو ته مثبت سان شروع ڪريون. هتي اهي معيار آهن جيڪي عملدرآمد کي رسيپشن ۽ ڪشش ڏين ٿا:-
سست شروعات: جڏهن هڪ ڪلاس لوڊ ڪيو ويندو آهي جڏهن ته ايپليڪيشن هلندي رهي ٿي جڏهن اها ضرورت هجي.
-
ڪوڊ جي سادگي ۽ شفافيت: ميٽرڪ، يقينا، موضوعي، پر اهم آهي.
-
موضوع جي حفاظت: صحيح طريقي سان ڪم ڪري ٿو گھڻن موضوعن واري ماحول ۾.
-
گھڻن موضوعن واري ماحول ۾ اعلي ڪارڪردگي: ٿريڊس ھڪ ٻئي کي گھٽ ۾ گھٽ بلاڪ ڪن ٿا يا بلڪل نه جڏھن وسيلن کي شيئر ڪيو وڃي.
-
غير سستي شروعات: جڏهن هڪ ڪلاس لوڊ ڪيو ويندو آهي جڏهن ايپليڪيشن شروع ٿئي ٿي، قطع نظر ان جي ضرورت آهي يا نه (هڪ تضاد، آئي ٽي دنيا ۾ اهو بهتر آهي ته سست ٿيڻ)
-
ڪوڊ جي پيچيدگي ۽ غريب پڙهڻ جي صلاحيت. ميٽرڪ پڻ تابع آهي. اسان سمجهون ٿا ته اکين مان رت اچي ته عمل ائين ئي آهي.
-
تارن جي حفاظت جي کوٽ. ٻين لفظن ۾، "ڌاڳو خطرو". گھڻن موضوعن واري ماحول ۾ غلط آپريشن.
-
گهڻن موضوعن واري ماحول ۾ خراب ڪارڪردگي: موضوع هڪ ٻئي کي هر وقت بلاڪ ڪندا آهن يا اڪثر ڪري جڏهن وسيلن کي حصيداري ڪندا آهن.
ڪوڊ
ھاڻي اسان مختلف عملن جي اختيارن تي غور ڪرڻ لاء تيار آھيون، نفعو ۽ نقصان جي لسٽنگ:سادي حل
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return INSTANCE;
}
}
آسان ترين عمل. فائدا:
-
ڪوڊ جي سادگي ۽ شفافيت
-
تار جي حفاظت
-
گھڻن موضوعن واري ماحول ۾ اعلي ڪارڪردگي
- نه سست شروعات.
سست شروعات
public class Singleton {
private static Singleton INSTANCE;
private Singleton() {}
public static Singleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
فائدا:
-
سست شروعات.
-
نه تار محفوظ
هم وقت سازي رسائيندڙ
public class Singleton {
private static Singleton INSTANCE;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
فائدا:
-
سست شروعات.
-
تار جي حفاظت
-
گھڻن موضوعن واري ماحول ۾ خراب ڪارڪردگي
getInstance
هم وقت سازي آهي، ۽ توهان ان کي صرف هڪ وقت ۾ داخل ڪري سگهو ٿا. حقيقت ۾، اسان کي پوري طريقي سان هم وقت سازي ڪرڻ جي ضرورت ناهي، پر ان جو صرف اهو حصو جنهن ۾ اسان هڪ نئين طبقي اعتراض کي شروع ڪريون ٿا. پر اسان صرف ان حصي کي لپي نٿا سگھون جيڪو synchronized
بلاڪ ۾ نئين شئي ٺاهڻ لاءِ ذميوار آهي: هي ٿريڊ جي حفاظت فراهم نه ڪندو. اهو ٿورو وڌيڪ پيچيده آهي. صحيح هم وقت سازي جو طريقو هيٺ ڏنل آهي:
ڊبل چيڪ ٿيل تالا
public class Singleton {
private static Singleton INSTANCE;
private Singleton() {
}
public static Singleton getInstance() {
if (INSTANCE == null) {
synchronized (Singleton.class) {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
}
}
return INSTANCE;
}
}
فائدا:
-
سست شروعات.
-
تار جي حفاظت
-
گھڻن موضوعن واري ماحول ۾ اعلي ڪارڪردگي
-
1.5 کان گھٽ جاوا ورزن تي سپورٽ نه ڪئي وئي (وولٽائل ڪي ورڊ ورزن 1.5 ۾ مقرر ڪيو ويو)
INSTANCE
يا ته هجڻ گهرجي final
، يا volatile
. آخري عمل جنهن تي اسين اڄ بحث ڪنداسين Class Holder Singleton
.
ڪلاس هولڊر سنگلٽن
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;
}
}
فائدا:
-
سست شروعات.
-
تار جي حفاظت.
-
گھڻن موضوعن واري ماحول ۾ اعلي ڪارڪردگي.
-
صحيح آپريشن لاءِ، ان ڳالهه جي ضمانت ڏيڻ ضروري آهي ته ڪلاس جي اعتراض کي
Singleton
بغير غلطين جي شروعات ڪئي وئي آهي. ٻي صورت ۾، پهريون طريقو ڪالgetInstance
هڪ غلطي ۾ ختم ٿي ويندوExceptionInInitializerError
، ۽ سڀ بعد وارا ناڪام ٿي وينداNoClassDefFoundError
.
عمل درآمد | سست شروعات | تار جي حفاظت | گھڻائي واري رفتار | جڏهن استعمال ڪرڻ لاء؟ |
---|---|---|---|---|
سادي حل | - | + | تڪڙو | ڪڏهن به نه. يا جڏهن سست شروع ڪرڻ ضروري ناهي. پر ڪڏهن به بهتر ناهي. |
سست شروعات | + | - | لاڳو نٿو ٿئي | هميشه جڏهن multithreading جي ضرورت نه آهي |
هم وقت سازي رسائيندڙ | + | + | آهستي آهستي | ڪڏهن به نه. يا جڏهن multithreading سان ڪم جي رفتار ڪا به ڳالهه ناهي. پر ڪڏهن به بهتر ناهي |
ڊبل چيڪ ٿيل تالا | + | + | تڪڙو | نادر ڪيسن ۾ جڏهن توهان هڪ سنگلٽن ٺاهڻ وقت استثناء کي سنڀالڻ جي ضرورت آهي. (جڏهن ڪلاس هولڊر سنگلٽن لاڳو نه آهي) |
ڪلاس هولڊر سنگلٽن | + | + | تڪڙو | هميشه جڏهن multithreading جي ضرورت آهي ۽ اتي هڪ گارنٽي آهي ته هڪ سنگل ڪلاس اعتراض پيدا ڪيو ويندو بغير ڪنهن مسئلن جي. |
سنگلٽن جي نموني جا فائدا ۽ نقصان
عام طور تي، سنگلٽن اهو ئي ڪري ٿو جيڪو ان جي توقع آهي:-
هڪ گارنٽي فراهم ڪري ٿي ته هڪ ڪلاس ۾ صرف هڪ ڪلاس جو مثال هوندو.
-
ھن ڪلاس جي ھڪڙي مثال کي عالمي رسائي پوائنٽ مهيا ڪري ٿي.
-
سنگلٽن SRP جي خلاف ورزي ڪري ٿو (اڪيلو ذميواري اصول) - سنگلٽن ڪلاس، پنهنجي فوري ذميوارين کان علاوه، ان جي ڪاپين جي تعداد کي پڻ ڪنٽرول ڪري ٿو.
-
هڪ سنگلٽن تي باقاعده طبقي يا طريقي جو انحصار طبقي جي عوامي معاهدي ۾ نظر نٿو اچي.
-
گلوبل variables خراب آهن. سنگلٽن آخرڪار هڪ وڏي عالمي متغير ۾ بدلجي ٿو.
-
سنگلٽن جي موجودگي عام طور تي ايپليڪيشن جي قابليت کي گھٽائي ٿي ۽ طبقن جيڪي خاص طور تي سنگلٽن کي استعمال ڪن ٿا.
GO TO FULL VERSION