Singleton näme?
Singleton, synpda ulanyp boljak iň ýönekeý dizaýn nagyşlaryndan biridir. Adamlar käwagt “bu synp ýeketäk” diýýärler, bu synpyň ýeke-täk dizaýn nusgasyny durmuşa geçirýändigini aňladýar. Käwagt diňe bir obýektiň döredilip bilinjek synpyny ýazmaly bolýar. Mysal üçin, maglumat bazasyna girmek ýa-da birikmek üçin jogapkär synp. “Singleton” dizaýn nagşy, şeýle meseläni nädip ýerine ýetirip biljekdigimizi suratlandyrýar. Singleton iki zady ýerine ýetirýän dizaýn nagşydyr:-
Bir synpyň synpyň diňe bir mysaly boljakdygyna kepillik berýär.
-
Bu synpyň mysalynda global giriş nokadyny üpjün edýär.
-
Hususy konstruktor. Synpyň daşynda synp obýektlerini döretmek ukybyny çäklendirýär.
-
Synpyň mysalyny görkezýän köpçülikleýin statiki usul. Bu usul diýilýär
getInstance
. Bu synp mysalyna global giriş nokady.
Durmuşa geçirmegiň wariantlary
Singleton dizaýn nagşy dürli usullarda ulanylýar. Her bir warianty gowy we erbet. Bu ýerde, hemişe bolşy ýaly: ideal ýok, ýöne munuň üçin ymtylmaly. Allöne ilki bilen haýsynyň gowy, nämäniň erbetdigini we dizaýn ölçeginiň durmuşa geçirilişine baha bermegiň haýsy ölçeglere täsir edýändigini kesgitläliň. Oňynlardan başlalyň. Ine, ýerine ýetiriş şiresi we özüne çekiji ölçegler:-
Azyalta başlangyç: programma zerur wagty işleýän wagtynda synp ýüklenende.
-
Koduň ýönekeýligi we aýdyňlygy: ölçeg, elbetde, subýektiw, ýöne möhümdir.
-
Sapagyň howpsuzlygy: köp sapakly gurşawda dogry işleýär.
-
Köp sapakly gurşawda ýokary öndürijilik: çeşmeler paýlaşylanda sapaklar biri-birini minimal bloklaýar ýa-da asla ýok.
-
Yalta däl başlangyç: programma başlanda, zerur ýa-da ýokdugyna garamazdan synp ýüklenende (paradoks, IT dünýäsinde ýalta bolmak has gowudyr)
-
Koduň çylşyrymlylygy we okalmazlygy. Metrik hem subýektiw. Gan gözlerden gelýän bolsa, ýerine ýetiriş şeýle diýeris.
-
Saplaryň howpsuzlygynyň bolmazlygy. Başgaça aýdylanda, “sapak howpy”. Köp sapakly gurşawda nädogry işlemek.
-
Köp sapakly gurşawda pes öndürijilik: sapaklar hemişe ýa-da çeşme paýlaşylanda biri-birini ýapýar.
Kod
Indi oňaýly we zyýanly taraplaryny sanap, durmuşa geçirmegiň dürli wariantlaryna garamaga taýyn:Pleönekeý çözgüt
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return INSTANCE;
}
}
Iň ýönekeý durmuşa geçirmek. Taraz:
-
Koduň ýönekeýligi we aýdyňlygy
-
Tekstiň howpsuzlygy
-
Köp sapakly gurşawda ýokary öndürijilik
- Yalta başlangyç däl.
Yalta başlangyç
public class Singleton {
private static Singleton INSTANCE;
private Singleton() {}
public static Singleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
Taraz:
-
Yalta başlangyç.
-
Threadüplük howpsuz däl
Sinhronlaşdyrylan aksesuar
public class Singleton {
private static Singleton INSTANCE;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
Taraz:
-
Yalta başlangyç.
-
Tekstiň howpsuzlygy
-
Köp sapakly gurşawda pes öndürijilik
getInstance
sinhronlaşdyryldy we ony diňe bir gezek girizip bilersiňiz. Aslynda, tutuş usuly sinhronlamak zerurlygy ýok, diňe täze synp obýektini başlaýan bölegimiz. synchronized
Simplyöne täze bir obýekt döretmek üçin jogapkär bölegi blokda örtüp bilmeris : bu sapak howpsuzlygyny üpjün etmeýär. Biraz çylşyrymly. Dogry sinhronizasiýa usuly aşakda berilýär:
Iki gezek barlanan gulplama
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;
}
}
Taraz:
-
Yalta başlangyç.
-
Tekstiň howpsuzlygy
-
Köp sapakly gurşawda ýokary öndürijilik
-
1.5-den pes Java wersiýalarynda goldanylmaýar (üýtgäp durýan açar söz 1.5 wersiýada düzedildi)
INSTANCE
bolmaly . Bu gün ara alyp maslahatlaşjak iň soňky durmuşa geçirişimiz . final
volatile
Class Holder Singleton
Synp eýesi 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;
}
}
Taraz:
-
Yalta başlangyç.
-
Tekstiň howpsuzlygy.
-
Köp sapakly gurşawda ýokary öndürijilik.
-
Singleton
Dogry işlemek üçin synp obýektiniň ýalňyşsyz başlamagyny kepillendirmek zerurdyr . Otherwiseogsam, ilkinji usul jaňygetInstance
ýalňyşlyk bilen gutararExceptionInInitializerError
we indiki çagyryşlaryň hemmesi şowsuz bolarNoClassDefFoundError
.
Durmuşa geçirmek | Yalta başlangyç | Tekstiň howpsuzlygy | Köp okalýan tizlik | Haçan ulanmaly? |
---|---|---|---|---|
Pleönekeý çözgüt | - | + | Çalt | Hiç haçan. Ora-da ýalta başlangyç möhüm däl bolsa. Neveröne hiç haçan gowy däl. |
Yalta başlangyç | + | - | Ulanylmaýar | Elmydama köp okamagyň zerurlygy ýok wagty |
Sinhronlaşdyrylan aksesuar | + | + | Lyuwaş-ýuwaşdan | Hiç haçan. Ora-da köp okamak bilen işiň tizliginiň ähmiýeti ýok. Neveröne hiç haçan gowy däl |
Iki gezek barlanan gulplama | + | + | Çalt | Seýrek ýagdaýlarda, ýekeje aýdym döredilende kadadan çykmalary çözmeli bolarsyňyz. (“Class Holder Singleton” ulanylmasa) |
Synp eýesi Singleton | + | + | Çalt | Elmydama köp okamak zerur bolanda we ýekeje synp obýektiniň kynçylyksyz dörediljekdigine kepillik bar. |
Singleton nagşynyň oňaýly taraplary
Umuman aýdanyňda, singleton garaşylýan zady ýerine ýetirýär:-
Bir synpyň synpyň diňe bir mysaly boljakdygyna kepillik berýär.
-
Bu synpyň mysalynda global giriş nokadyny üpjün edýär.
-
Singleton SRP-ni (leeke-täk jogapkärçilik ýörelgesi) bozýar - Singleton synpy, derrew jogapkärçiliklerinden başga-da, göçürmeleriniň sanyna hem gözegçilik edýär.
-
Adaty synpyň ýa-da usulyň ýeke-täklige baglylygy synpyň jemgyýetçilik şertnamasynda görünmeýär.
-
Global üýtgeýjiler erbet. Singleton ahyrsoňy bir uly global üýtgeýjä öwrülýär.
-
Singleton-yň bolmagy, umuman, programmanyň we esasanam singleton ulanýan synplaryň synag ukyplylygyny peseldýär.
GO TO FULL VERSION