Treci la conținutul principal

Ce este

Șablonul Singleton se asigură că o clasă are exact o singură instanță în tot programul și oferă tuturor același punct de acces la ea. Exemple tipice de singleton: o configurație, un grup de conexiuni, un logger.

Python are aici un avantaj: un modul este importat o singură dată, așa că un obiect creat la nivelul modulului este deja o instanță unică, partajată. Când crearea trebuie să fie leneșă — făcută la prima utilizare, nu la import — o metodă de clasă precum Config.instance() o păzește: creează instanța la primul apel și returnează instanța stocată la toate apelurile următoare.


Exemplu: o singură configurație pentru toți

Configurația este încărcată la primul apel Config.instance() și niciodată din nou. Fiecare apelant primește același obiect.

Încărcare o singură dată cu o metodă de clasă păzită

Linia „se încarcă configurația” se afișează o singură dată, deși Config.instance() este apelată de două ori — iar a is b dovedește că ambii apelanți au aceeași instanță.

Prompt
Scrie un program Python cu un singleton Config: o metodă de clasă instance() încarcă configurația exact o singură dată, afișând o linie în timpul încărcării. Apelează instance() de două ori, afișează numele aplicației și dovedește că ambele apeluri returnează același obiect, comparându-le cu is.
Ieșire: program Python complet

Când să îl folosești

Folosește-l când chiar trebuie să existe un singur exemplar al unui lucru: o singură configurație încărcată, un singur grup de conexiuni, un singur cache — iar crearea lui este costisitoare sau duplicatele ar intra în conflict.

Renunță la el când poți pur și simplu să creezi valoarea o singură dată la începutul programului și să o transmiți celor care au nevoie de ea. Transmiterea deschisă a dependențelor este mai clară decât accesul global — singletonul este ultima soluție, nu prima.


Avantaje și dezavantaje

Avantaje: instanță unică garantată; creare leneșă la prima utilizare; sistemul de module oferă cazul simplu aproape gratuit.

Dezavantaje: este o variabilă globală deghizată — dependențele ascunse fac codul mai greu de urmărit; testele nu îl pot înlocui ușor cu unul fals; folosirea excesivă duce la programe încâlcite.