Singleton nədir?
Singleton bir sinifə tətbiq oluna bilən ən sadə dizayn nümunələrindən biridir. İnsanlar bəzən “bu sinif singletondur” deyirlər, yəni bu sinif singleton dizayn modelini həyata keçirir. Bəzən yalnız bir obyekt yaradıla bilən bir sinif yazmaq lazımdır. Məsələn, verilənlər bazasına daxil olmaq və ya qoşulmaq üçün məsul olan sinif. Singleton dizayn nümunəsi belə bir tapşırığı necə yerinə yetirə biləcəyimizi təsvir edir. Singleton iki şeyi yerinə yetirən dizayn nümunəsidir:-
Sinfin yalnız bir nümunəsinə sahib olacağına zəmanət verir.
-
Bu sinfin nümunəsinə qlobal giriş nöqtəsi təqdim edir.
-
Şəxsi konstruktor. Sinfin özündən kənarda sinif obyektləri yaratmaq imkanını məhdudlaşdırır.
-
Sinfin nümunəsini qaytaran ictimai statik metod. Bu üsul deyilir
getInstance
. Bu, sinif nümunəsinə qlobal giriş nöqtəsidir.
İcra variantları
Singilton dizayn nümunəsi müxtəlif yollarla istifadə olunur. Hər bir seçim öz yolunda yaxşı və pisdir. Burada, həmişə olduğu kimi: ideal yoxdur, amma bunun üçün səy göstərmək lazımdır. Ancaq hər şeydən əvvəl, nəyin yaxşı və nəyin pis olduğunu və dizayn nümunəsinin həyata keçirilməsinin qiymətləndirilməsinə hansı ölçülərin təsir etdiyini müəyyən edək. Müsbətdən başlayaq. Tətbiqə şirəlilik və cəlbedicilik verən meyarlar bunlardır:-
Tənbəl başlatma: proqram tam olaraq lazım olduqda işləyərkən sinif yükləndikdə.
-
Kodun sadəliyi və şəffaflığı: metrik, əlbəttə ki, subyektivdir, lakin vacibdir.
-
Mövzu təhlükəsizliyi: çox yivli mühitdə düzgün işləyir.
-
Çox yivli mühitdə yüksək performans: resurs paylaşarkən iplər bir-birini minimal şəkildə bloklayır və ya heç blok etmir.
-
Tənbəl olmayan başlatma: ehtiyac olub-olmamasından asılı olmayaraq, proqram işə salındıqda sinif yükləndikdə (paradoks, İT dünyasında tənbəl olmaq daha yaxşıdır)
-
Kodun mürəkkəbliyi və zəif oxunması. Metrik də subyektivdir. Güman edəcəyik ki, gözdən qan gəlirsə, icrası belədir.
-
İp təhlükəsizliyinin olmaması. Başqa sözlə, "yiv təhlükəsi". Çox yivli mühitdə səhv əməliyyat.
-
Çox yivli mühitdə zəif performans: resurs paylaşarkən mövzular hər zaman və ya tez-tez bir-birini bloklayır.
Kod
İndi müsbət və mənfi cəhətləri sadalayan müxtəlif tətbiq variantlarını nəzərdən keçirməyə hazırıq:Sadə Həll
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return INSTANCE;
}
}
Ən sadə icra. Müsbət cəhətləri:
-
Kodun sadəliyi və şəffaflığı
-
İp təhlükəsizliyi
-
Çox yivli mühitdə yüksək performans
- Tənbəl başlatma deyil.
Lazy Initialization
public class Singleton {
private static Singleton INSTANCE;
private Singleton() {}
public static Singleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
Müsbət cəhətləri:
-
Tənbəl başlatma.
-
İplik təhlükəsiz deyil
Sinxronlaşdırılmış Aksessuar
public class Singleton {
private static Singleton INSTANCE;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
Müsbət cəhətləri:
-
Tənbəl başlatma.
-
İp təhlükəsizliyi
-
Çox yivli mühitdə zəif performans
getInstance
sinxronlaşdırılıb və siz onu yalnız bir-bir daxil edə bilərsiniz. Əslində, bütün metodu sinxronizasiya etmək lazım deyil, yalnız onun yeni sinif obyektini işə saldığımız hissəsidir. synchronized
Amma biz sadəcə olaraq yeni obyektin yaradılmasına cavabdeh olan hissəni bloka bağlaya bilmərik : bu, ipin təhlükəsizliyini təmin etməyəcək. Bir az daha mürəkkəbdir. Düzgün sinxronizasiya üsulu aşağıda verilmişdir:
İkiqat yoxlanılmış kilidləmə
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;
}
}
Müsbət cəhətləri:
-
Tənbəl başlatma.
-
İp təhlükəsizliyi
-
Çox yivli mühitdə yüksək performans
-
1.5-dən aşağı Java versiyalarında dəstəklənmir (uçucu açar söz 1.5 versiyasında düzəldilib)
INSTANCE
olmalıdır . Bu gün müzakirə edəcəyimiz son tətbiq . final
volatile
Class Holder Singleton
Sinif Sahibi 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;
}
}
Müsbət cəhətləri:
-
Tənbəl başlatma.
-
İp təhlükəsizliyi.
-
Çox yivli mühitdə yüksək performans.
-
Singleton
Düzgün işləmək üçün sinif obyektinin səhvsiz işə salınmasına zəmanət vermək lazımdır . Əks halda, birinci metod çağırışıgetInstance
xəta ilə başa çatacaqExceptionInInitializerError
və bütün sonrakılar uğursuz olacaqNoClassDefFoundError
.
İcra | Tənbəl başlatma | İp təhlükəsizliyi | Çox iş parçacığı sürəti | Nə vaxt istifadə etməli? |
---|---|---|---|---|
Sadə Həll | - | + | Sürətli | Heç vaxt. Və ya tənbəl başlatma vacib olmadıqda. Amma heç vaxt daha yaxşı. |
Lazy Initialization | + | - | Uyğun deyil | Həmişə multithreading lazım olmadıqda |
Sinxronlaşdırılmış Aksessuar | + | + | Yavaş-yavaş | Heç vaxt. Və ya multithreading ilə iş sürəti fərq etmədikdə. Amma heç vaxt daha yaxşı deyil |
İkiqat yoxlanılmış kilidləmə | + | + | Sürətli | Nadir hallarda, təkton yaratarkən istisnaları idarə etmək lazım olduqda. (Class Holder Singleton tətbiq edilmədikdə) |
Sinif Sahibi Singleton | + | + | Sürətli | Həmişə multithreading tələb olunduqda və singleton sinif obyektinin problemsiz yaradılacağına zəmanət olduqda. |
Singleton modelinin müsbət və mənfi cəhətləri
Ümumiyyətlə, singleton ondan gözlənilən şeyi edir:-
Sinfin yalnız bir nümunəsinə sahib olacağına zəmanət verir.
-
Bu sinfin nümunəsinə qlobal giriş nöqtəsi təqdim edir.
-
Singleton SRP-ni (Single Responsibility Principle) pozur - Singleton sinfi bilavasitə məsuliyyətlərinə əlavə olaraq, nüsxələrinin sayına da nəzarət edir.
-
Adi sinif və ya metodun singletondan asılılığı sinfin açıq müqaviləsində görünmür.
-
Qlobal dəyişənlər pisdir. Singilton nəticədə bir böyük qlobal dəyişənə çevrilir.
-
Singiltonun mövcudluğu ümumiyyətlə tətbiqin və xüsusilə singletondan istifadə edən siniflərin sınaqdan keçirilməsini azaldır.
GO TO FULL VERSION