Синглтон чист?
Синглтон яке аз соддатарин намунаҳои тарроҳӣ мебошад, ки метавонад ба синф татбиқ карда шавад. Баъзан одамон мегӯянд, ки "ин синф як синглтон аст", яъне ин синф намунаи тарроҳии синглтонро амалӣ мекунад. Баъзан синферо навиштан лозим аст, ки барои он танҳо як an object сохта мешавад. Масалан, синфе, ки барои сабт ё пайвастшавӣ ба пойгоҳи додаҳо масъул аст. Намунаи тарроҳии Singleton тасвир мекунад, ки чӣ гуна мо метавонем чунин вазифаро иҷро кунем. Синглтон як намунаи тарроҳӣ мебошад, ки ду чизро иҷро мекунад:-
Кафолат медиҳад, ки синф танҳо як мисоли синфро дорад.
-
Нуқтаи дастрасии глобалиро ба мисоли ин синф таъмин мекунад.
-
Конструктори хусусӣ. Қобorяти эҷоди an objectҳои синфро берун аз худи синф маҳдуд мекунад.
-
Усули статикии оммавӣ, ки намунаи синфро бармегардонад. Ин усул номида мешавад
getInstance
. Ин нуқтаи дастрасии глобалӣ ба мисоли синф аст.
Вариантҳои татбиқ
Намунаи тарроҳии singleton бо роҳҳои гуногун истифода мешавад. Ҳар як вариант ба таври худ хуб ва бад аст. Дар ин ҷо, чун ҳамеша: идеал нест, аммо шумо бояд барои он кӯшиш кунед. Аммо пеш аз ҳама, биёед муайян кунем, ки чӣ хуб аст ва чӣ бад аст ва кадом нишондиҳандаҳо ба арзёбии татбиқи намунаи тарҳрезӣ таъсир мерасонанд. Биёед бо мусбат оғоз кунем. Инҳоянд меъёрҳое, ки ба татбиқи болаззат ва ҷолибият медиҳанд:-
Оғозкунии танбал: вақте ки синф ҳангоми кор кардани барнома маҳз вақте лозим аст, бор карда мешавад.
-
Содда ва шаффофияти code: метрика, албатта, субъективӣ, аммо муҳим аст.
-
Бехатарии ришта: дар муҳити чанд ришта дуруст кор мекунад.
-
Иҷрои баланд дар муҳити чанд ришта: риштаҳо ҳангоми мубодилаи манбаъ ҳамдигарро ба ҳадди ақал мебанданд ё тамоман не.
-
Оғозкунии танбалӣ: вақте ки синф ҳангоми оғоз кардани барнома, новобаста аз он ки он лозим аст ё не (парадокс, дар ҷаҳони IT танбал будан беҳтар аст)
-
Мушкилот ва хониши сусти code. Метрик низ субъективӣ аст. Фарз мекунем, ки агар аз чашм хун ояд, амалй со-кин аст.
-
Набудани бехатарии ришта. Ба ибораи дигар, "хатари ришта". Амали нодуруст дар муҳити чанд ришта.
-
Иҷрои суст дар муҳити чанд ришта: риштаҳо ҳама вақт ё аксар вақт ҳангоми мубодилаи манбаъ ҳамдигарро маҳкам мекунанд.
Кодекс
Ҳоло мо омодаем, ки вариантҳои гуногуни татбиқро баррасӣ кунем, бо номбар кардани ҷиҳатҳои мусбӣ ва манфии:Ҳалли оддӣ
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return INSTANCE;
}
}
Татбиқи соддатарин. Тарафдор:
-
Содда ва шаффофияти code
-
Бехатарии ришта
-
Иҷрои баланд дар муҳити бисёрсоҳавӣ
- Оғозкунии танбал нест.
Ташаббуси танбалӣ
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
ҳамоҳанг карда шудааст ва шумо метавонед онро дар як вақт ворид кунед. Дар асл, ба мо лозим нест, ки тамоми усулро ҳамоҳанг созем, балки танҳо он қисми он, ки дар он мо an objectи синфи навро оғоз мекунем. Аммо мо наметавонем synchronized
қисматеро, ки барои сохтани an objectи нав дар блок масъул аст, печонем: ин бехатарии риштаро таъмин намекунад. Ин каме мураккабтар аст. Усули дурусти ҳамоҳангсозӣ дар зер оварда шудааст:
Қулфи дукарата санҷидашуда
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;
}
}
Тарафдор:
-
Оғозсозии танбал.
-
Бехатарии ришта
-
Иҷрои баланд дар муҳити бисёрсоҳавӣ
-
Дар versionҳои Java камтар аз 1.5 дастгирӣ намешавад (калимаи калидӣ дар versionи 1.5 ислоҳ карда шудааст)
INSTANCE
бояд ё бошад final
, ё volatile
. Иҷрои охирине, ки мо имрӯз муҳокима хоҳем кард Class Holder Singleton
.
Дорандаи синфи 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;
}
}
Тарафдор:
-
Оғозсозии танбал.
-
Бехатарии ришта.
-
Иҷрои баланд дар муҳити бисёрсоҳавӣ.
-
Барои дуруст кор кардан, кафолат додан лозим аст, ки an objectи синф
Singleton
бе хато оғоз карда мешавад. Дар акси ҳол, занги усули аввалgetInstance
бо хатогӣ анҷом меёбадExceptionInInitializerError
ва ҳамаи зангҳои минбаъда ноком мешавандNoClassDefFoundError
.
Амалй | Оғозсозии танбал | Бехатарии ришта | Суръати чанд ришта | Кай истифода бурдан мумкин аст? |
---|---|---|---|---|
Ҳалли оддӣ | - | + | Тез | Ҳеҷ гоҳ. Ё вақте ки оғози танбал муҳим нест. Аммо ҳеҷ гоҳ беҳтар. |
Ташаббуси танбалӣ | + | - | Иҷронашаванда | Ҳамеша вақте ки чанд ришта лозим нест |
Аксессори ҳамоҳангшуда | + | + | Оҳиста-оҳиста | Ҳеҷ гоҳ. Ё вақте ки суръати кор бо multithreading аҳамият надорад. Аммо ҳеҷ гоҳ беҳтар |
Қулфи дукарата санҷидашуда | + | + | Тез | Дар ҳолатҳои нодир, вақте ки шумо бояд ҳангоми сохтани синглтон истисноҳоро ҳал кунед. (вақте ки Class Holder Singleton татбиқ намешавад) |
Дорандаи синфи Singleton | + | + | Тез | Ҳамеша вақте ки чанд ришта лозим аст ва кафолат вуҷуд дорад, ки an objectи синфи singleton бе мушкилот эҷод карда мешавад. |
Тарафҳо ва нуқсонҳои намунаи Singleton
Умуман, синглтон он чизеро, ки аз он интизор аст, иҷро мекунад:-
Кафолат медиҳад, ки синф танҳо як мисоли синфро дорад.
-
Нуқтаи дастрасии глобалиро ба мисоли ин синф таъмин мекунад.
-
Singleton SRP (Principle Single Responsibility Principle)-ро вайрон мекунад - синфи Singleton, ба ғайр аз масъулиятҳои бевоситаи худ, шумораи нусхаҳои онро низ назорат мекунад.
-
Вобастагии синф ё усули муқаррарӣ аз синглтон дар шартномаи ҷамъиятии синф намоён нест.
-
Тағйирёбандаҳои глобалӣ бад мебошанд. Синглтон дар ниҳоят ба як тағирёбандаи глобалӣ табдил меёбад.
-
Мавҷудияти синглтон қобorяти санҷиши барномаро дар маҷмӯъ ва синфҳоеро, ки синглтонро истифода мебаранд, коҳиш медиҳад.
GO TO FULL VERSION