Kuidas luua Singletoni C++-s

Kuidas Luua Singletoni C S



C++ keeles on singleton kujunduspõhimõte, mis tagab klassi üksiku eksemplari olemasolu kogu programmis ja annab sellele konkreetsele eksemplarile globaalse pöörduspunkti.

Üksikmustrit kasutatakse tavaliselt siis, kui teil on vaja ühte jagatud ressurssi, millele tuleks juurde pääseda globaalselt, nagu andmebaasiühendus, logija või konfiguratsioonihaldur. Ühe eksemplari jõustamisel võimaldab see programmi mitmel osal samale objektile juurde pääseda ja seda muuta, edendades andmete järjepidevust ja vähendades vajadust globaalsete muutujate järele. Singletoni saab kasutada objektide vahemäluna, kus sageli kasutatavaid või kulukaid loomisobjekte salvestatakse ja kasutatakse kogu rakenduse jooksul uuesti. See lähenemisviis aitab parandada jõudlust, vältides objektide üleliigset loomist ja lähtestamist.

Selles artiklis selgitame üksiktooni loomist ja demonstreerime näidet üksiku tooni stiliseerimisest C++ programmis.







Näide 1: Lihtsa Singletoni loomine innuka initsialiseerimisega

Varase initsialiseerimisega lihtne singleton on kujundusmuster, mis tagab, et klassist luuakse ainult üks eksemplar ja seda luuakse innukalt staatilise lähtestamise ajal.



Demonstreerime põhikoodijuppi lihtsa innuka initsialiseerimisega singletoni loomiseks. Alustame programmiga:



#include

klassi Singleton {
privaatne :
staatiline Singleton * näiteks ;
Singleton ( ) { }
avalik :
staatiline Singleton * getInstance ( ) {
tagasi näiteks ;
}
} ;


Singleton * Singleton :: näiteks = uus Singleton ( ) ;

int peamine ( ) {

Singleton * singletonInstance1 = Singleton :: getInstance ( ) ;

Singleton * singletonInstance2 = Singleton :: getInstance ( ) ;

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

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

tagasi 0 ;

}

Kood sisaldab päist , mis võimaldab töötada sisend- ja väljundvoogudega, näiteks 'std::cout'.





Pärast päisefaili lisamist määratleme klassi 'Singleton', mis esindab üksiku mustri rakendamist. Sellel on privaatne konstruktor ja privaatne staatiline liikmemuutuja nimega 'instance'.

Seejärel rakendatakse funktsioon getInstance() klassi 'Singleton' avaliku staatilise liikmefunktsioonina. See tagastab üksiku liikme eksemplari, mis on salvestatud staatilise liikme muutuja eksemplari. Staatilise liikme muutuja eksemplar määratletakse ja lähtestatakse väljaspool klassi parameetriga 'Singleton* Singleton::instance = new Singleton();'. See rida lähtestab staatilise lähtestamise ajal innukalt klassi 'Singleton' eksemplari.



Funktsioonis main() deklareerime kaks osutit 'singletonInstance1' ja 'singletonInstance2' ning määrame väärtuse, mis tagastatakse, kutsudes välja Singleton::getInstance(). Kuna eksemplari initsialiseeritakse innukalt, osutavad mõlemad osutid samale eksemplarile. Avaldused 'std::cout' prindivad konsooli 'singletonInstance1' ja 'singletonInstance2' mäluaadressid, kasutades operaatorit '<<' ja 'std::endl'.

Kood lõpeb 'tagasi 0-ga', mis näitab programmi edukat täitmist.

Selle koodi käivitamisel on väljund umbes selline:

Väljund kuvab 'singletonInstance1' ja 'singletonInstance2' mäluaadressid. Kuna mõlemale osutile on määratud sama eksemplar, mis on saadud failist Singleton::getInstance(), on neil sama mäluaadress. See näitab, kuidas üksikmuster tagab, et klassis on üks eksemplar ja et tulevased getInstance() kutsed annavad alati sama eksemplari.

Näide 2: Singletoni mustri rakendamine laisa initsialiseerimisega

See esitlus selgitab üksiku mustri rakendamist laisa lähtestamise korral ja näitab selle kasutamist funktsioonis main(). Koodilõigu samm-sammult selgitus on esitatud pärast seda programmi:

#include

klassi Singleton {

privaatne :

staatiline Singleton * näiteks ;

Singleton ( ) {

std :: cout << 'Loodi üks eksemplar.' << std :: endl ;

}

avalik :

staatiline Singleton * getInstance ( ) {

kui ( näiteks == nullptr ) {

näiteks = uus Singleton ( ) ;

}

tagasi näiteks ;

}

tühine näita Sõnumit ( ) {

std :: cout << 'Tere Singletonilt!' << std :: endl ;

}

~Singleton ( ) {

std :: cout << 'Singletoni eksemplar hävitatud.' << std :: endl ;

}

} ;

Singleton * Singleton :: näiteks = nullptr ;

int peamine ( ) {

Singleton * singletonInstance1 = Singleton :: getInstance ( ) ;

singletonInstance1 -> näita Sõnumit ( ) ;

Singleton * singletonInstance2 = Singleton :: getInstance ( ) ;

singletonInstance2 -> näita Sõnumit ( ) ;

tagasi 0 ;

}

Programm alustab sisend-/väljundülesannete täitmiseks päisefaili lisamisega. Seejärel deklareerime ja määratleme 'Singletoni' klassi. Klassi ainsat eksemplari hoitakse privaatses staatilises liikmemuutujas nimega 'instance'.

Kui kutsutakse klassi 'Singleton' konstruktor, genereerib see klassi 'Singleton' eksemplari. See väljastab konsooli sõnumi 'Singletoni eksemplar loodud', kasutades käsku 'std::cout << … << std::endl;'. Konstruktoril pole parameetreid, kuna see on vaikekonstruktor. See on määratletud kui Singleton() ilma argumentideta. Me kuulutame selle privaatseks, mis tähendab, et seda saab kutsuda ainult klassi seest. See hoiab ära klassi 'Singleton' otsese eksemplari ja tagab, et ainus viis eksemplari hankimiseks on funktsiooni getInstance() kaudu.

Klassi 'Singleton' meetod getInstance() on deklareeritud avaliku staatilise liikmefunktsioonina. Selle ülesanne on luua ja anda juurdepääs üksikule eksemplarile. GetInstance() sees kontrollib see, kas eksemplar on 'nullptr'. Kui see on nii, mis tähendab, et eksemplari pole veel olemas, kasutab see privaatkonstruktorit klassi 'Singleton' uue objekti loomiseks.

Funktsioon showMessage() on lihtne liigefunktsioon, mis kuvab 'Tere Singletonilt!' sõnum. Singli hävitaja on määratletud. Seda nimetatakse kaudselt, kui programm lõpetab ja prindib teate 'Singletoni eksemplar hävitatud'. teade, mis näitab, et üksikjuhtum on hävitatud. Staatilise liikme muutuja eksemplar on algselt määratletud kui 'nullptr'.

Int main() alustab funktsiooni main() definitsiooni. Seejärel 'Singleton* singletonInstance1 = Singleton::getInstance();' kutsub esile klassi 'Singleton' funktsiooni getInstance(), et saada kursor üksikule eksemplarile. See määrab selle osuti muutujale 'singletonInstance1'.

Pärast seda kuvatakse 'singletonInstance1->showMessage();' kasutab nooleoperaatorit (->) funktsiooni showMessage() kutsumiseks kursoril 'singletonInstance1'. See funktsioon kuvab konsoolile selles määratud teate. Seejärel 'Singleton* singletonInstance2 = Singleton::getInstance();' kutsub uuesti funktsiooni getInstance() välja, saades ühekordsele eksemplarile veel ühe osuti. Seekord määrab see kursori muutujale 'singletonInstance2'. 'singletonInstance2->showMessage();' kutsub esile 'singletonInstance2' osuti funktsiooni showMessage(). See funktsioon kuvab 'Tere Singletonilt!' sõnum uuesti konsooli.

Lõpuks 'tagasta 0;' tähistab funktsiooni main() lõppu ja programm tagastab väärtuse 0, mis tähistab programmi edukat täitmist.

Siin on eelnevalt selgitatud koodilõigu väljund:

See tulemus kinnitab, et klass 'Singleton' tagab ainult ühe eksemplari loomise ja et funktsiooni getInstance() edasised väljakutsed annavad usaldusväärselt sama eksemplari.

Järeldus

Üksiku loomine C++-s on väga kasulik kontseptsioon. Selles postituses käsitlesime algselt singletoni sissejuhatavat osa. Lisaks luuakse kaks näidet singletoni rakendamiseks C++ keeles. Esimene illustratsioon näitab innuka üksiku initsialiseerimise rakendamist. Singletoni mustri laisk lähtestamise rakendamine on toodud selle artikli teises näites. Lisaks kuvatakse vastavate programmide jaoks ka toodetud väljundi hetktõmmised.