Singleton uzorak je jedan od jednostavnijih dizajn obrazaca. Klasa koja koristi singleton dizajn uzorak ima jednu instancu kojom sama upravlja. Ova klasa sprječava bilo koju drugu klasu da stvori njezinu instancu.
Jednostruka klasa također pruža jednu globalnu pristupnu točku instanci koju kreira. Dakle, svaka klasa koja želi instancu jednostruke klase mora joj pristupiti putem svoje jedinstvene pristupne točke.
Javina izvrsna podrška za objektno orijentirano programiranje olakšava korištenje singleton dizajn uzorka.
Implementacija Singleton uzorka pomoću Jave
Postoji mnogo načina za implementaciju singleton uzorka u Javi; revni i lijeni pristupi uobičajene su varijacije. Svaki od ovih pristupa ima svoje prednosti i nedostatke. Stoga bi metoda koju odaberete trebala ovisiti o tome kako će vaša aplikacija raditi.
Revni pristup
Implementacija singleton uzorka s revnim pristupom znači da klasa stvara novu instancu same sebe kada se učitava.
javnostrazredaEagerSingleton{
privatnastatički Instanca EagerSingleton = novi EagerSingleton();privatnaEagerSingleton(){}
javnoststatički EagerSingleton getInstance(){
povratak primjer;
}
}
The EagerSingletonJava klasa stvara novu instancu sebe dok se učitava. Dodjeljuje ovu instancu privatnoj statici varijabla instance, koji je dostupan samo unutar klase singleton. Jedina točka vanjskog pristupa varijabli instance je kroz getInstance() metoda. Ta metoda vraća prethodno kreiranu instancu klase.
Ovaj pristup je izvrstan jer sprječava višenitnosti problem, koji je jedan od najvećih izazova singleton obrasca. Rješava problem višenitnosti stvaranjem nove instance same sebe prije nego što bilo koja nova nit može pristupiti svojoj varijabli instance. Ovo jamči da će svaka nit imati pristup samo istoj instanci.
Međutim, revni pristup praktičan je samo ako će vaša aplikacija koristiti instancu klase singleton dok se pokreće. Inače ćete stvoriti objekt prije nego što ga vaša aplikacija zatreba, nepotrebno koristeći resurse.
Lijeni pristup
Lijeni pristup rješenje je problema željnog pristupa. Omogućuje vam stvaranje nove instance jednostruke klase samo kada to vaš program treba.
javnostrazredaLijeniSingleton{
privatnanepostojanstatički LazySingleton instanca;privatnaLijeniSingleton(){}
javnoststatički LijeniSingleton getInstance(){
ako (instanca == ništavan) {
sinkronizirano (Lijeni Singleton.razreda) {
ako (instanca == ništavan) {
instanca = novi LazySingleton();
}
}
}
povratak primjer;
}
}
Lijeni pristup rješava problem višenitnosti korištenjem sinkronizirano ključna riječ. Ovo sprječava da dvije niti istovremeno dobiju pristup varijabli instance. Sinkronizirano je skupo, pa ga aplikacija koristi samo jednom, kada prvi put pozove getInstance().
Kada koristiti uzorak jednog elementa
Uzorak Singleton koristan je u mnogim scenarijima, za stvaranje dijaloških okvira, rukovanje postavkama registra ili upravljanje skupovima niti.
Druga uobičajena upotreba obrasca singleton je stvaranje središnje klase koja upravlja vezama baze podataka.