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ță.
Ieșire: program Python complet
class Config:
_instance = None
def __init__(self, app_name: str):
self.app_name = app_name
# Singura instanță este creată la primul apel, apoi refolosită.
@classmethod
def instance(cls) -> "Config":
if cls._instance is None:
print("se încarcă configurația (o singură dată)")
cls._instance = cls("PromptCookbook")
return cls._instance
a = Config.instance()
b = Config.instance()
print("aplicație:", a.app_name)
print("aceeași instanță:", a is b)
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.