Kako stvoriti Singleton u C++

Kako Stvoriti Singleton U C



U C++-u, singleton je načelo dizajna koje osigurava prisutnost pojedinačne instance klase u cijelom programu i pruža globalnu pristupnu točku toj određenoj instanci.

Uzorak singleton obično se koristi kada trebate imati jedan zajednički resurs kojemu treba pristupiti globalno, kao što je veza s bazom podataka, zapisivač ili upravitelj konfiguracije. Provođenjem jedne instance, omogućuje višestrukim dijelovima programa pristup i izmjenu istog objekta, promičući dosljednost podataka i smanjujući potrebu za globalnim varijablama. Singleton se može koristiti kao predmemorija objekata gdje se objekti koji se često koriste ili skupi za stvaranje pohranjuju i ponovno koriste u cijeloj aplikaciji. Ovaj pristup pomaže u poboljšanju performansi izbjegavanjem stvaranja i inicijalizacije suvišnog objekta.

U ovom ćemo članku objasniti stvaranje singletona i pokazati primjer stiliziranja singletona u C++ programu.







Primjer 1: Stvaranje jednostavnog pojedinačnog elementa s brzom inicijalizacijom

Jednostavan singleton s ranom inicijalizacijom je obrazac dizajna koji osigurava stvaranje samo jedne instance klase, a ona se nestrpljivo stvara tijekom statičke inicijalizacije.



Demonstrirat ćemo osnovni isječak koda za stvaranje jednostavnog singletona s brzom inicijalizacijom. Počnimo s programom:



#include

klasa Singleton {
privatna :
statički Samac * primjer ;
Samac ( ) { }
javnost :
statički Samac * getInstance ( ) {
povratak primjer ;
}
} ;


Samac * Samac :: primjer = novi Singleton ( ) ;

int glavni ( ) {

Samac * singletonInstance1 = Samac :: getInstance ( ) ;

Samac * singletonInstance2 = Samac :: getInstance ( ) ;

std :: cout << 'singletonletonInstance1: ' << singletonInstance1 << std :: endl ;

std :: cout << 'singletonletonInstance2: ' << singletonInstance2 << std :: endl ;

povratak 0 ;

}

Kod uključuje zaglavlje koje pruža funkcionalnost za rad s ulaznim i izlaznim tokovima kao što je 'std::cout'.





Nakon uključivanja datoteke zaglavlja, definiramo klasu 'Singleton' koja predstavlja implementaciju uzorka singleton. Ima privatni konstruktor i privatnu statičku varijablu člana pod nazivom 'instanca'.

Zatim se funkcija getInstance() implementira kao javna statička funkcija člana klase 'Singleton'. Vraća instancu singletona koja je pohranjena u instanci statičke varijable člana. Instanca varijable statičnog člana definirana je i inicijalizirana izvan klase s “Singleton* Singleton::instance = new Singleton();”. Ovaj redak revno inicijalizira instancu klase 'Singleton' tijekom statičke inicijalizacije.



U funkciji main() deklariramo dva pokazivača, “singletonInstance1” i “singletonInstance2”, i dodjeljujemo vrijednost koja se vraća pozivanjem Singleton::getInstance(). Budući da se instanca spremno inicijalizira, oba pokazivača pokazuju na istu instancu. Naredbe “std::cout” ispisuju memorijske adrese “singletonInstance1” i “singletonInstance2” na konzolu pomoću operatora “<<” i “std::endl”.

Kod završava s 'return 0' što označava uspješno izvršenje programa.

Kada pokrenete ovaj kod, izlaz je nešto poput ovoga:

Izlaz prikazuje memorijske adrese 'singletonInstance1' i 'singletonInstance2'. Budući da su oba pokazivača dodijeljena s istom instancom koja se dobiva iz Singleton::getInstance(), imaju istu memorijsku adresu. Ovo pokazuje kako singleton uzorak jamči da postoji jedna instanca klase i da budući pozivi getInstance() uvijek rezultiraju istom instancom.

Primjer 2: Implementacija pojedinačnog uzorka s odlijepljenom inicijalizacijom

Ova demonstracija objašnjava implementaciju singleton uzorka s lijenom inicijalizacijom i pokazuje njegovu upotrebu u funkciji main(). Objašnjenje isječka koda korak po korak nalazi se nakon ovog programa:

#include

klasa Singleton {

privatna :

statički Samac * primjer ;

Samac ( ) {

std :: cout << 'Jedna instanca stvorena.' << std :: endl ;

}

javnost :

statički Samac * getInstance ( ) {

ako ( primjer == nullptr ) {

primjer = novi Singleton ( ) ;

}

povratak primjer ;

}

poništiti showMessage ( ) {

std :: cout << 'Pozdrav iz Singletona!' << std :: endl ;

}

~Samac ( ) {

std :: cout << 'Singleton instanca uništena.' << std :: endl ;

}

} ;

Samac * Samac :: primjer = nullptr ;

int glavni ( ) {

Samac * singletonInstance1 = Samac :: getInstance ( ) ;

singletonInstance1 -> showMessage ( ) ;

Samac * singletonInstance2 = Samac :: getInstance ( ) ;

singletonInstance2 -> showMessage ( ) ;

povratak 0 ;

}

Program počinje dodavanjem datoteke zaglavlja za izvršavanje ulazno/izlaznih zadataka. Zatim deklariramo i definiramo klasu 'Singleton'. Jedina instanca klase čuva se unutar privatne statičke varijable člana pod nazivom 'instanca'.

Kad god se pozove konstruktor klase 'Singleton', on generira instancu klase 'Singleton'. Konzoli šalje poruku 'Jedna instanca stvorena' koristeći 'std::cout << … << std::endl;'. Konstruktor nema nikakve parametre jer je zadani konstruktor. Definiran je kao Singleton() bez ikakvih argumenata. Proglašavamo ga privatnim što znači da se može pozvati samo iz klase. Ovo sprječava izravnu instanciranje klase 'Singleton' i osigurava da je jedini način za dobivanje instance kroz funkciju getInstance().

Metoda getInstance() klase 'Singleton' deklarirana je kao javna statička funkcija člana. On je u ulozi uspostavljanja i dodjele pristupa pojedinačnoj instanci. Unutar getInstance(), provjerava je li instanca 'nullptr'. Ako jest, što znači da instanca još nije prisutna, ona koristi privatni konstruktor za instanciranje novog objekta klase 'Singleton'.

Funkcija showMessage() jednostavna je funkcija članica koja prikazuje 'Pozdrav iz Singletona!' poruka. Definiran je destruktor singletona. Poziva se implicitno kada program prekine i ispiše 'Singleton instanca uništena.' poruka koja označava da je singleton instanca uništena. Instanca varijable statičnog člana je inicijalno definirana kao 'nullptr'.

Int main() započinje definiciju funkcije main(). Zatim, 'Singleton* singletonInstance1 = Singleton::getInstance();' poziva funkciju getInstance() klase 'Singleton' za dobivanje pokazivača na instancu singleton. Dodjeljuje ovaj pokazivač varijabli 'singletonInstance1'.

Nakon toga, “singletonInstance1->showMessage();” koristi operator strelice (->) za pozivanje funkcije showMessage() na pokazivaču “singletonInstance1”. Ova funkcija prikazuje poruku koja je u njoj navedena na konzoli. Nakon toga, 'Singleton* singletonInstance2 = Singleton::getInstance();' ponovno poziva funkciju getInstance(), dobivajući još jedan pokazivač na instancu singleton. Ovaj put, dodjeljuje pokazivač na varijablu 'singletonInstance2'. “singletonInstance2->showMessage();” poziva funkciju showMessage() na pokazivaču “singletonInstance2”. Ova funkcija prikazuje 'Hello from Singleton!' ponovno pošaljite poruku na konzolu.

Na kraju, 'vrati 0;' označava kraj funkcije main(), a program vraća vrijednost 0 što označava uspješno izvršenje programa.

Ovo je rezultat prethodno objašnjenog isječka koda:

Ovaj rezultat potvrđuje da klasa 'Singleton' osigurava stvaranje samo jedne instance i da daljnji pozivi funkcije getInstance() pouzdano daju istu instancu.

Zaključak

Stvaranje singletona u C++ vrlo je koristan koncept. U ovom smo postu prvo obradili uvodni dio singletona. Nadalje, proizvedena su dva primjera za implementaciju singletona u C++. Prva ilustracija prikazuje implementaciju eager singleton inicijalizacije. Dok je implementacija lijene inicijalizacije pojedinačnog uzorka navedena u drugom primjeru ovog članka. Štoviše, snimke proizvedenog izlaza također se prikazuju za odgovarajuće programe.