Modelul singleton

[Versiunea în limba engleză a articolului poate fi găsită aici].

Prin acest post deschid o serie de articole dedicate modelelor de design. Tot ce scriu se bazează numai pe experiența personală.







Modelele de proiectare reprezintă o descriere a unor probleme care apar în timpul proiectării orientate pe obiecte, precum și modul de rezolvare a acestora (atât practică, cât și teoretică). Cu alte cuvinte, acestea sunt exemple de abordări corecte pentru rezolvarea problemelor tipice de proiectare.

Implementare simplu Singleton

Una dintre cele mai ușoare căi de a implementa un model Singleton în limba Java arată astfel:

Acum voi da câteva explicații cu privire la punerea în aplicare a șablonului.

Metoda getInstance () va crea exact o instanță a clasei Singleton. Această metodă este declarată ca fiind sincronizată. De aceea. În programele multi-threaded, atunci când apelați metoda getInstance () din mai multe fire în același timp, puteți crea mai multe instanțe ale clasei Singleton. Și trebuie să existe doar unul!

Puteți să scăpați de modificatorul sincronizat. Pentru a face acest lucru, instanța trebuie inițializată:

și în metoda getInstance (), eliminați constructul "if". Apoi, inițializarea va avea loc la momentul încărcării clasei.

Dar utilizarea inițializării târzii (inițializare leneșă) este preferabilă dacă crearea unei instanțe de clasă durează mult timp. Și în cazul inițializării lenece, este posibil să se rezolve excepțiile generate atunci când se numește constructorul.







Singleton cu blocare dublă

Problema cu inițializarea leneșă rămâne numai în faptul că sincronizarea este necesară doar o singură dată, astfel încât mai multe fire nu intră în secțiunea critică în același timp. Dar, după ce am creat o instanță a clasei, aș vrea să scap de sincronizare.

Cea mai obișnuită modalitate de a scăpa de sincronizarea inutilă este blocarea dublată, care arată astfel:

Singleton cu titular de instanță

Iată o altă opțiune meritantă de a implementa Modelul Unic cu inițializare leneșă:

Obiectul va fi inițializat prima dată când se va apela metoda getInstance (). Asta înseamnă că am transferat problema cu sincronizarea la nivelul încărcătorului de clasă.

Dar ce se întâmplă dacă există mai mulți încărcătoare de clasă în aplicație sau avem un sistem distribuit cu mai multe mașini virtuale Java? Apoi, totul este complicat. Să vorbim despre asta o altă dată.

În general, acum este la modă să spunem că o versiune foarte interesantă a modelului Single pare astfel:

Asta e tot. Da, da! De ce avem nevoie de asta?

Un exemplu practic al unui singleton

Deseori trebuie să folosesc acest model atunci când lucrez cu configurația. Uneori configurația programului este stocată convenabil într-un fișier. Să presupunem că acesta este un fișier text simplu "props.txt" cu linii ca "key = value". Trebuie să ne asigurăm că configurația din program va fi într-o singură copie. Al doilea nu ar fi fost creat, dar trebuie să împiedicăm utilizatorul clasei să facă acest lucru. Și așa,

Acum puteți utiliza structura formularului pentru a lucra cu configurația:

Dacă numele proprietăților din "props.txt" nu se schimbă, le puteți descrie în clasă în felul următor:

iar valorile sunt după cum urmează:

Modelul Singleton este util nu numai când lucrați cu configurații. Poate fi folosit și atunci când scrieți ConnectionPool, Factory și alte lucruri.

Acum totul este sigur.







Articole similare

Trimiteți-le prietenilor: