Modelul singleton este unul dintre modelele de design mai simple. O clasă care utilizează modelul de design singleton are o singură instanță pe care o gestionează singură. Această clasă împiedică orice altă clasă să creeze o instanță a acesteia.
O clasă singleton oferă, de asemenea, un singur punct de acces global la instanța pe care o creează. Deci, orice clasă care dorește o instanță a unei clase singleton, trebuie să o acceseze prin punctul său de acces unic.
Suportul excelent al Java pentru programarea orientată pe obiecte face ușoară utilizarea modelului de design singleton.
Implementarea modelului Singleton folosind Java
Există multe moduri de a implementa modelul singleton în Java; abordările dornice și leneșe sunt variații comune. Fiecare dintre aceste abordări are propriile sale merite și dezavantaje. Prin urmare, metoda pe care alegeți să o utilizați ar trebui să depindă de modul în care va funcționa aplicația dvs.
Abordarea dornică
Implementarea modelului singleton cu abordarea eager înseamnă că clasa creează o nouă instanță a ei înșiși atunci când se încarcă.
publicclasăEagerSingleton{
privatstatic Instanță EagerSingleton = nou EagerSingleton();privatEagerSingleton(){}
publicstatic EagerSingleton getInstance(){
întoarcere instanță;
}
}
The EagerSingletonClasa Java creează o nouă instanță pe măsură ce se încarcă. Atribuie această instanță staticului privat variabila de instanta, care este accesibil numai în cadrul clasei singleton. Singurul punct de acces extern la variabila de instanță este prin intermediul getInstance() metodă. Această metodă returnează instanța creată anterior a clasei.
Această abordare este grozavă, deoarece previne multithreading problemă, care este una dintre cele mai mari provocări ale modelului singleton. Rezolvă problema multithreading prin crearea unei noi instanțe înainte ca orice fir nou să poată accesa variabila de instanță. Acest lucru garantează că fiecare fir va avea acces doar la aceeași instanță.
Cu toate acestea, abordarea dornică este practică doar dacă aplicația dvs. va folosi o instanță a clasei singleton pe măsură ce începe să ruleze. În caz contrar, veți crea un obiect înainte ca aplicația dvs. să aibă nevoie de el, folosind resurse în mod inutil.
Abordarea leneșă
Abordarea leneșă este soluția la problema abordării dornice. Vă permite să creați o nouă instanță a unei clase singleton numai atunci când programul dumneavoastră are nevoie de ea.
publicclasăLazySingleton{
privatvolatilstatic Instanță LazySingleton;privatLazySingleton(){}
publicstatic LazySingleton getInstance(){
dacă (instanță == nul) {
sincronizate (LazySingleton.clasă) {
dacă (instanță == nul) {
instanță = nou LazySingleton();
}
}
}
întoarcere instanță;
}
}
Abordarea leneșă rezolvă problema multithreading folosind sincronizate cuvânt cheie. Acest lucru împiedică două fire de execuție să obțină acces la variabila de instanță în același timp. Sincronizat este, totuși, costisitor, așa că aplicația îl folosește o singură dată, când apelează pentru prima dată getInstance().
Când să utilizați modelul Singleton
Modelul Singleton este util în multe scenarii, pentru a crea casete de dialog, a gestiona setările de registry sau a gestiona pool-uri de fire.
O altă utilizare comună a modelului singleton este crearea unei clase centrale care gestionează conexiunile la baze de date.