Kako ustvariti enojni element v C++

Kako Ustvariti Enojni Element V C



V C++ je singleton načelo oblikovanja, ki zagotavlja prisotnost posameznega primerka razreda v celotnem programu in zagotavlja globalno dostopno točko do tega določenega primerka.

Vzorec singleton se običajno uporablja, ko morate imeti en vir v skupni rabi, do katerega morate dostopati globalno, kot je povezava z bazo podatkov, zapisovalnik ali upravitelj konfiguracije. Z uveljavljanjem enega samega primerka omogoča več delom programa dostop do istega predmeta in njegovo spreminjanje, kar spodbuja doslednost podatkov in zmanjšuje potrebo po globalnih spremenljivkah. Singleton se lahko uporabi kot predpomnilnik objektov, kjer se pogosto uporabljeni ali dragi objekti shranjujejo in ponovno uporabljajo v celotni aplikaciji. Ta pristop pomaga izboljšati zmogljivost z izogibanjem ustvarjanju in inicializaciji odvečnega objekta.

V tem članku bomo razložili ustvarjanje singletona in prikazali primer stilizacije singletona v programu C++.







Primer 1: Ustvarjanje preprostega posameznega elementa z nestrpno inicializacijo

Preprost singleton z zgodnjo inicializacijo je načrtovalski vzorec, ki zagotavlja, da je ustvarjen samo en primerek razreda, ki se nestrpno ustvari med statično inicializacijo.



Predstavili bomo osnovni odrezek kode za ustvarjanje preprostega singletona z vneto inicializacijo. Začnimo s programom:



#include

razred Singleton {
zasebno :
statična Singleton * primerek ;
Singleton ( ) { }
javnosti :
statična Singleton * getInstance ( ) {
vrnitev primerek ;
}
} ;


Singleton * Singleton :: primerek = novi Singleton ( ) ;

int glavni ( ) {

Singleton * singletonInstance1 = Singleton :: getInstance ( ) ;

Singleton * singletonInstance2 = Singleton :: getInstance ( ) ;

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

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

vrnitev 0 ;

}

Koda vključuje glavo , ki zagotavlja funkcionalnost za delo z vhodnimi in izhodnimi tokovi, kot je »std::cout«.





Po vključitvi datoteke glave definiramo razred »Singleton«, ki predstavlja implementacijo vzorca singleton. Ima zasebni konstruktor in zasebno statično spremenljivko člana z imenom »primerek«.

Nato je funkcija getInstance() implementirana kot javna statična funkcija člana razreda »Singleton«. Vrne primerek singla, ki je shranjen v primerku spremenljivke statičnega člana. Primerek spremenljivke statičnega člana je definiran in inicializiran zunaj razreda z »Singleton* Singleton::instance = new Singleton();«. Ta vrstica med statično inicializacijo vneto inicializira primerek razreda »Singleton«.



V funkciji main() deklariramo dva kazalca, »singletonInstance1« in »singletonInstance2«, in dodelimo vrednost, ki je vrnjena s klicem funkcije Singleton::getInstance(). Ker je primerek nestrpno inicializiran, oba kazalca kažeta na isti primerek. Stavki »std::cout« natisnejo pomnilniške naslove »singletonInstance1« in »singletonInstance2« na konzolo z uporabo operatorja »<<« in »std::endl«.

Koda se konča z 'return 0', ki označuje uspešno izvedbo programa.

Ko zaženete to kodo, je rezultat nekaj takega:

Izhod prikaže pomnilniške naslove »singletonInstance1« in »singletonInstance2«. Ker sta oba kazalca dodeljena istemu primerku, pridobljenemu iz Singleton::getInstance(), imata isti pomnilniški naslov. To prikazuje, kako vzorec singleton zagotavlja, da obstaja en sam primerek razreda in da prihodnji klici getInstance() vedno povzročijo isti primerek.

Primer 2: Implementacija vzorca enega elementa z leno inicializacijo

Ta predstavitev pojasnjuje implementacijo vzorca singleton z leno inicializacijo in prikazuje njegovo uporabo v funkciji main(). Postopna razlaga delčka kode je na voljo za tem programom:

#include

razred Singleton {

zasebno :

statična Singleton * primerek ;

Singleton ( ) {

std :: cout << 'Enotni primerek ustvarjen.' << std :: konec ;

}

javnosti :

statična Singleton * getInstance ( ) {

če ( primerek == nullptr ) {

primerek = novi Singleton ( ) ;

}

vrnitev primerek ;

}

praznina showMessage ( ) {

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

}

~Samski ( ) {

std :: cout << 'Enotni primerek uničen.' << std :: konec ;

}

} ;

Singleton * Singleton :: primerek = nullptr ;

int glavni ( ) {

Singleton * singletonInstance1 = Singleton :: getInstance ( ) ;

singletonInstance1 -> showMessage ( ) ;

Singleton * singletonInstance2 = Singleton :: getInstance ( ) ;

singletonInstance2 -> showMessage ( ) ;

vrnitev 0 ;

}

Program se začne z dodajanjem datoteke glave za izvajanje vhodno/izhodnih nalog. Nato deklariramo in definiramo razred »Singleton«. Edini primerek razreda je shranjen znotraj zasebne statične spremenljivke člana z imenom »primerek«.

Kadarkoli se pokliče konstruktor razreda »Singleton«, ustvari primerek razreda »Singleton«. Izpiše sporočilo »Singleton instance created« na konzolo z uporabo »std::cout << … << std::endl;«. Konstruktor nima parametrov, saj je privzeti konstruktor. Definiran je kot Singleton() brez kakršnih koli argumentov. Razglasimo ga kot zasebnega, kar pomeni, da ga je mogoče priklicati samo znotraj razreda. To preprečuje neposredno instanciranje razreda »Singleton« in zagotavlja, da je edini način za pridobitev primerka prek funkcije getInstance().

Metoda getInstance() razreda »Singleton« je deklarirana kot javna statična funkcija člana. Je v vlogi vzpostavitve in podeljevanja dostopnosti primerku singleton. Znotraj getInstance() preveri, ali je primerek »nullptr«. Če je, kar pomeni, da primerek še ni prisoten, uporabi zasebni konstruktor za instanco novega predmeta razreda »Singleton«.

Funkcija showMessage() je preprosta funkcija člana, ki prikaže »Pozdrav iz Singletona!« sporočilo. Destruktor singletona je definiran. Pokliče se implicitno, ko se program konča in natisne 'primer enega samca je uničen.' sporočilo, ki nakazuje, da je primerek singleton uničen. Primerek spremenljivke statičnega člana je na začetku definiran kot »nullptr«.

Int main() začne definicijo funkcije main(). Nato »Singleton* singletonInstance1 = Singleton::getInstance();« pokliče funkcijo getInstance() razreda »Singleton«, da pridobi kazalec na primerek singleton. Ta kazalec dodeli spremenljivki »singletonInstance1«.

Po tem se 'singletonInstance1->showMessage();' uporablja operator puščice (->) za klic funkcije showMessage() na kazalcu »singletonInstance1«. Ta funkcija konzoli prikaže sporočilo, ki je v njej navedeno. Nato je »Singleton* singletonInstance2 = Singleton::getInstance();« ponovno pokliče funkcijo getInstance() in pridobi še en kazalec na primerek z enim samcem. Tokrat dodeli kazalec spremenljivki »singletonInstance2«. »singletonInstance2->showMessage();« pokliče funkcijo showMessage() na kazalcu »singletonInstance2«. Ta funkcija prikaže »Hello from Singleton!« ponovno sporočilo v konzolo.

Nazadnje, 'vrni 0;' označuje konec funkcije main(), program pa vrne vrednost 0, kar pomeni uspešno izvedbo programa.

Tukaj je rezultat prej razloženega delčka kode:

Ta rezultat potrjuje, da razred »Singleton« zagotavlja ustvarjanje samo enega primerka in da nadaljnji klici funkcije getInstance() zanesljivo prinesejo isti primerek.

Zaključek

Ustvarjanje singletona v C++ je zelo uporaben koncept. V tej objavi smo najprej obravnavali uvodni del singletona. Poleg tega sta izdelana dva primera za implementacijo singletona v C++. Prva ilustracija prikazuje izvedbo inicializacije eager singleton. Medtem ko je implementacija lene inicializacije vzorca singleton navedena v drugem primeru tega članka. Poleg tega so prikazani tudi posnetki proizvedenega rezultata za ustrezne programe.