Singleton nima?
Singleton - bu sinfga qo'llanilishi mumkin bo'lgan eng oddiy dizayn naqshlaridan biri. Odamlar ba'zan "bu sinf singleton" deyishadi, ya'ni bu sinf singleton dizayn naqshini amalga oshiradi. Ba'zan faqat bitta ob'ekt yaratilishi mumkin bo'lgan sinfni yozish kerak bo'ladi. Masalan, ma'lumotlar bazasiga kirish yoki ulanish uchun mas'ul bo'lgan sinf. Singleton dizayn namunasi bunday vazifani qanday bajarishimiz mumkinligini tasvirlaydi. Singleton - bu ikkita narsani bajaradigan dizayn namunasi:-
Sinfning faqat bitta nusxasiga ega bo'lishiga kafolat beradi.
-
Ushbu sinf namunasiga global kirish nuqtasini taqdim etadi.
-
Xususiy konstruktor. Sinf ob'ektlarini sinfdan tashqarida yaratish qobiliyatini cheklaydi.
-
Sinf namunasini qaytaradigan umumiy statik usul. Bu usul deyiladi
getInstance
. Bu sinf misoliga global kirish nuqtasi.
Amalga oshirish imkoniyatlari
Singleton dizayn namunasi turli usullarda qo'llaniladi. Har bir variant o'ziga xos tarzda yaxshi va yomon. Bu erda, har doimgidek: ideal yo'q, lekin siz bunga intishingiz kerak. Lekin, birinchi navbatda, nima yaxshi va nima yomon ekanligini va dizayn namunasini amalga oshirishni baholashga qanday ko'rsatkichlar ta'sir qilishini aniqlaylik. Keling, ijobiy tomondan boshlaylik. Amalga oshirishning jozibadorligi va jozibadorligini ta'minlaydigan mezonlar:-
Dangasa ishga tushirish: dastur kerak bo'lganda ishlayotgan vaqtda sinf yuklanganda.
-
Kodning soddaligi va shaffofligi: ko'rsatkich, albatta, sub'ektiv, ammo muhim.
-
Ip xavfsizligi: ko'p tarmoqli muhitda to'g'ri ishlaydi.
-
Ko'p tarmoqli muhitda yuqori unumdorlik: resursni almashishda iplar bir-birini minimal darajada bloklaydi yoki umuman bloklamaydi.
-
Dangasa bo'lmagan ishga tushirish: kerak yoki kerak emasligidan qat'i nazar, dastur ishga tushganda sinf yuklanganda (paradoks, IT olamida dangasa bo'lish yaxshiroqdir)
-
Kodning murakkabligi va yomon o'qilishi. Ko'rsatkich ham sub'ektivdir. Agar qon ko'zdan chiqsa, amalga oshirish shunday bo'ladi deb taxmin qilamiz.
-
Ip xavfsizligining etishmasligi. Boshqacha qilib aytganda, "ip xavfi". Ko'p tarmoqli muhitda noto'g'ri ishlash.
-
Ko'p tarmoqli muhitda yomon ishlash: mavzular har doim yoki ko'pincha manbani ulashganda bir-birini bloklaydi.
Kod
Endi biz ijobiy va salbiy tomonlarini sanab o'tish uchun turli xil variantlarni ko'rib chiqishga tayyormiz:Oddiy yechim
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return INSTANCE;
}
}
Eng oddiy amalga oshirish. Taroziga soling:
-
Kodning soddaligi va shaffofligi
-
Ip xavfsizligi
-
Ko'p tarmoqli muhitda yuqori ishlash
- Dangasa ishga tushirish emas.
Lazy Initialization
public class Singleton {
private static Singleton INSTANCE;
private Singleton() {}
public static Singleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
Taroziga soling:
-
Dangasa ishga tushirish.
-
Ip xavfsiz emas
Sinxronlashtirilgan aksessuarlar
public class Singleton {
private static Singleton INSTANCE;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
Taroziga soling:
-
Dangasa ishga tushirish.
-
Ip xavfsizligi
-
Ko'p tarmoqli muhitda yomon ishlash
getInstance
sinxronlashtirildi va siz uni bir vaqtning o'zida kiritishingiz mumkin. Aslida, biz butun usulni sinxronlashtirishimiz shart emas, faqat uning yangi sinf ob'ektini ishga tushiradigan qismi. Lekin biz yangi ob'ektni yaratish uchun mas'ul bo'lgan qismni oddiygina blokga o'ra olmaymiz synchronized
: bu ip xavfsizligini ta'minlamaydi. Bu biroz murakkabroq. To'g'ri sinxronlash usuli quyida keltirilgan:
Ikki marta tekshirilgan qulflash
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;
}
}
Taroziga soling:
-
Dangasa ishga tushirish.
-
Ip xavfsizligi
-
Ko'p tarmoqli muhitda yuqori ishlash
-
Java 1.5 dan past versiyalarida qoʻllab-quvvatlanmaydi (uchuvchi kalit soʻz 1.5 versiyada oʻrnatildi)
INSTANCE
bo'lishi kerak . Biz bugun muhokama qiladigan oxirgi dastur . final
volatile
Class Holder Singleton
Sinf egasi 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;
}
}
Taroziga soling:
-
Dangasa ishga tushirish.
-
Ip xavfsizligi.
-
Ko'p tarmoqli muhitda yuqori ishlash.
-
Singleton
To'g'ri ishlashi uchun sinf ob'ekti xatosiz ishga tushirilishini kafolatlash kerak . Aks holda, birinchi usul chaqiruvigetInstance
xato bilan tugaydiExceptionInInitializerError
va keyingi barchalari muvaffaqiyatsiz bo'ladiNoClassDefFoundError
.
Amalga oshirish | Dangasa ishga tushirish | Ip xavfsizligi | Ko'p tarmoqli tezligi | Qachon foydalanish kerak? |
---|---|---|---|---|
Oddiy yechim | - | + | Tez | Hech qachon. Yoki dangasa ishga tushirish muhim bo'lmaganda. Lekin hech qachon yaxshiroq. |
Lazy Initialization | + | - | Qo'llanilmaydigan, qo'llab bo'lmaydigan | Har doim multithreading kerak bo'lmaganda |
Sinxronlashtirilgan aksessuarlar | + | + | Sekin-asta | Hech qachon. Yoki multithreading bilan ishlash tezligi muhim emas. Lekin hech qachon yaxshiroq |
Ikki marta tekshirilgan qulflash | + | + | Tez | Singleton yaratishda istisnolardan foydalanish kerak bo'lgan kamdan-kam hollarda. (Agar Class Holder Singleton qo'llanilmasa) |
Sinf egasi Singleton | + | + | Tez | Har doim multithreading kerak bo'lganda va singleton sinf ob'ekti muammosiz yaratilishiga kafolat mavjud. |
Singleton naqshining ijobiy va salbiy tomonlari
Umuman olganda, singleton undan kutilgan narsani aniq bajaradi:-
Sinfning faqat bitta nusxasiga ega bo'lishiga kafolat beradi.
-
Ushbu sinf namunasiga global kirish nuqtasini taqdim etadi.
-
Singleton SRP (Single Responsibility Principle) ni buzadi - Singleton klassi o'zining bevosita mas'uliyatidan tashqari, uning nusxalari sonini ham nazorat qiladi.
-
Muntazam sinf yoki usulning singletonga bog'liqligi sinfning ommaviy shartnomasida ko'rinmaydi.
-
Global o'zgaruvchilar yomon. Singleton oxir-oqibat bitta katta global o'zgaruvchiga aylanadi.
-
Singletonning mavjudligi umuman dasturning sinovdan o'tish qobiliyatini va xususan, singletondan foydalanadigan sinflarni kamaytiradi.
GO TO FULL VERSION