| | |
| |
|
Единствен Јава објект (singleton) |
прегледано: |
201765 |
вкупно гласови: |
4 |
средна оценка: |
5.0 |
коментари: |
9 |
испрати до пријател
испечати
|
За тие коишто не слушнале за дизајн патерн (design pattern) претходно, или на кои им е познат изразот, но не и значењето, дизајн патерн е шема за развој на софтвер. Целта на шемата е да дефинира начин или техника која може да се употреби како градбена единка за конструкција на софтвер - решавање на универзални проблеми кои ги имаат програмерите. Тоа се всушност решенија кои се предаваат од еден на друг. Гледај на дизајн патерн како на корисен совет за дизајнирање на софтвер.
Еден од дизајн-патерните е синглтон (singleton). Синглтон е објект кој не може да се инстанцира. На почеток, ова може да изгледа неинтуитивно - сепак, нас ни треба инстанца на објект пред да го користиме. Да, синглтонот може да се креира, но не може да се инстанцира од програмерот - тоа значи дека синглтон класата има контрола над тоа како се креира. Рестрикцијата на синглтонот е дека може да постои само една инстанца од синглтонот креирана од јава виртуелната машина (JVM) - со превенција на директно инстанцирање можеме да се осигураме дека програмерите нема да креираат втора копија.
Зошто би користело ова? Често, при дизајн на систем, сакаме да имаме контрола како се користи некој објект, и да спречиме некој (вклучувајќи не и нас) да прави копии или да креира нови инстанци. На пример, централен конфигурациски објект што чува информации треба да има една и само една инстанца - глобална копија пристапна од било кој дел на апликацијата, вклучувајќи ги сите активни нишки (threads). Креирањето на нов конфигурациски објект е потполно бескорисно, бидејќи некои делови од апликацијата може да гледаат во стар конфигурациски објект, и промените нема да се пренесат подеднакво низ цела апликација. Ова е чест критериум за дизајн (не е користен секој ден, но се јавува потреба од време на време). Синглтон патернот може да се искористи во било кој јазик, но бидејќи ние сме Java програмери, да видиме како може да се имплементира во Java.
Спречување на директно инстанцирање
Сите знаеме како се инстанцираат објекти, нели? Ако не, да се потсетиме.
Објектите се инстанцираат со користењеот на клучниот збор "new". Тој збор овозможува креирање на нова инстанца на објект и специфицирање на параметри во класниот конструктор. Не мора да се специфицираат параметри, и во тој случај се повикува "празниот" конструктор. Конструкторите можат да бидат public или private, кои користат за контрола на тоа кои класи можат да го повикаат конструкторот. За да спречиме директно инстанцирање, креираме приватен "празен" конструктор, такашто другите класи нема да можат да креираат нова инстанца.
Ќе почнеме со класната дефиниција за класата SingletonObject. После, ќе вметнеме "празен" конструктор кој е маркиран како private. Не е потребен код во конструкторот, но може да се стави иницијализациски, доколку постои потреба.
public class SingletonObject {
private SingletonObject() {
// ne e potreben kod
}
}
Земање на синглтон инстанца
Треба да обезбедиме метод, кој враќа инстанца од SingletonObject класата, но не дозволува повеќе од една копија да биде пристапна. Можеме мануелно да инстанцираме објект, но мораме да чуваме референца кон синглтонот, такашто други последователни повици кон методот ќе ја враќаат истата копија (наместо да креираат нов објект). За да го направите ова, дефинирајте јавен статички метод наречен getSingletonObject(), и чувајте копија од синглтонот во приватна променлива.
public class SingletonObject {
private static SingletonObject ref;
private SingletonObject() {
// ne e potreben kod
}
public static SingletonObject getSingletonObject() {
if (ref == null)
// vo red e, mozeme da go povikame konstruktorot
ref = new SingletonObject();
return ref;
}
}
Досега, се е добро. Кога првпат ќе биде повикан, методот getSingletonObject() креира синглтон инстанца, ја сместува во променлива и го враќа самиот синглтон. Следните повици ќе го вратат истиот синглтон, и се е во ред. Можете да ја проширите функционалноста на синглтон објектот со додавање на нови методи, кои ќе ги извршуваат задачите сто се потребни од синглтонот. Синглтонот е готов, нели? Па, скоро...
Спречување на проблеми со нишки кај синглтоните
Мораме да се осигураме дека нишките кои го повикуваат методот getSingletonObject() не предизвикуваат проблеми, па препорачливо е методот да се маркира како synchronized. Ова спречува две нишки да го повикаат методот getSingletonObject() во исто време. Ако едната нишка влезе во методот одма после другата, може да се случи конструкторот на SingletonObject да се повика двапати да се вратат различни вредности. Затоа, сменете го методот во:
public static synchronized SingletonObject getSingletonObject()
Дали сега сме завршиле?
Со ова, да. Синглтон објектот гарантира дека ќе постои само една инстанца од оваа класа. Така? Па, не баш... Кога постои волја, постои и начин - сеуште е возможно да се креира повеќе од една инстанца од синглтон објектот. Повеќето од написите за синглтон го забораваат ова, бидејќи забораваат на клонирањето. Видете го следниов пример, кој клонира синглтон објект.
public class Clone {
public static void main(String args[]) throws Exception {
// Zemi singlton
SingletonObject obj = SingletonObject.getSingletonObject();
// Tuka se klonira objektot
SingletonObject clone = (SingletonObject) obj.clone();
}
}
Всушност, не постои clone() метод дефиниран во SingletonObject, но постои во java.lang.Object класата од која наследува. Вообичаено, методот clone() е маркиран како protected, но ако SingletonObject наследува класа која поддржува клонирање, возможно е да се нарушат принцпите за дизајн на синглтон. За да бидеме 100% сигурни дека синглтонот навистина е синглтон, мораме да додадеме наш clone() метод, и да фрлиме CloneNotSupportedException ако некој се осмели да клонира.
Ова е конечниот код за SingletonObject, кој можете да го користите како шема за вашите синглтони.
public class SingletonObject
{
private static SingletonObject ref;
private SingletonObject() {
// ne e potreben kod
}
public static SingletonObject getSingletonObject() {
if (ref == null)
// vo red e, mozeme da go povikame konstruktorot
ref = new SingletonObject();
return ref;
}
public Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}
}
Заклучок
Синглтон е класа која може да биде инстанцирана еднаш и само еднаш. Ова е понекогаш доста корисно во некои објектни дизајни. Креирањето на имплементација на синглтон е едноставно - спречете пристап до сите конструктори, креирајте статички метод за земање на синглтон инстанцата и спречете клонирање.
|
|
|
|
|
|
| |
|
|
---|
JavaTM и Java-базираните ознаки се трговски марки или регистрирани трговски марки на Sun Microsystems, Inc. во САД и други држави. Java.com.mk никако не соработува со Sun Microsystems, Inc. Сите други трговски марки се сопственост на нивните сопственици. |
|