Kaip sukurti singletoną C++

Kaip Sukurti Singletona C



C++ kalboje „singleton“ yra projektavimo principas, užtikrinantis atskiro klasės egzemplioriaus buvimą visoje programoje ir visuotinį prieigos tašką prie to konkretaus egzemplioriaus.

Vienkartinis modelis dažniausiai naudojamas, kai reikia turėti vieną bendrą išteklį, kuris turėtų būti pasiekiamas visame pasaulyje, pvz., duomenų bazės ryšys, registratorius arba konfigūracijos tvarkyklė. Įgyvendinant vieną egzempliorių, tai leidžia kelioms programos dalims pasiekti ir modifikuoti tą patį objektą, skatinant duomenų nuoseklumą ir sumažinant visuotinių kintamųjų poreikį. Singleton gali būti naudojamas kaip objekto talpykla, kurioje dažnai naudojami arba brangiai kuriami objektai yra saugomi ir pakartotinai naudojami visoje programoje. Šis metodas padeda pagerinti našumą išvengiant perteklinio objekto kūrimo ir inicijavimo.

Šiame straipsnyje paaiškinsime, kaip sukurti vientoną, ir pademonstruosime vientono stilizavimo C++ programoje pavyzdį.







1 pavyzdys: Paprasto singletono su uoliai inicijavimu kūrimas

Paprastas vienetas su ankstyva iniciacija yra dizaino modelis, užtikrinantis, kad būtų sukurtas tik vienas klasės egzempliorius, ir jis noriai kuriamas statinio inicijavimo metu.



Parodysime pagrindinį kodo fragmentą, skirtą paprastam viengubui su nekantria iniciacija sukurti. Pradėkime nuo programos:



#include

klasės Singletonas {
privatus :
statinis Singletonas * instancija ;
Singletonas ( ) { }
viešas :
statinis Singletonas * getInstance ( ) {
grąžinti instancija ;
}
} ;


Singletonas * Singletonas :: instancija = naujasis Singletonas ( ) ;

tarpt pagrindinis ( ) {

Singletonas * singletonInstance1 = Singletonas :: getInstance ( ) ;

Singletonas * singletonInstance2 = Singletonas :: getInstance ( ) ;

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

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

grąžinti 0 ;

}

Kode yra antraštė , kuri suteikia galimybę dirbti su įvesties ir išvesties srautais, tokiais kaip „std::cout“.





Įtraukę antraštės failą, apibrėžiame „Singleton“ klasę, kuri atspindi vieno modelio įgyvendinimą. Jis turi privatų konstruktorių ir privatų statinį nario kintamąjį, pavadintą „instance“.

Tada funkcija getInstance() įgyvendinama kaip vieša statinė „Singleton“ klasės nario funkcija. Jis grąžina vieneto egzempliorių, kuris saugomas statinio nario kintamojo egzemplioriuje. Statinio nario kintamojo egzempliorius apibrėžiamas ir inicijuojamas už klasės ribų su „Singleton* Singleton::instance = new Singleton();“. Ši eilutė noriai inicijuoja „Singleton“ klasės egzempliorių statinio inicijavimo metu.



Funkcijoje main() deklaruojame dvi rodykles „singletonInstance1“ ir „singletonInstance2“ ir priskiriame reikšmę, kuri grąžinama iškviečiant Singleton::getInstance(). Kadangi egzempliorius noriai inicijuojamas, abi rodyklės nurodo tą patį egzempliorių. Teiginiai „std::cout“ spausdina „singletonInstance1“ ir „singletonInstance2“ atminties adresus į konsolę naudodami „<<“ operatorių ir „std::endl“.

Kodas baigiasi „grįžta 0“, o tai rodo sėkmingą programos vykdymą.

Kai paleidžiate šį kodą, išvestis yra maždaug tokia:

Išvestyje rodomi „singletonInstance1“ ir „singletonInstance2“ atminties adresai. Kadangi abiem rodyklėms priskiriamas tas pats egzempliorius, gautas iš Singleton::getInstance(), jie turi tą patį atminties adresą. Tai parodo, kaip vienkartinis šablonas garantuoja, kad yra vienas klasės egzempliorius ir kad būsimi getInstance() iškvietimai visada sukelia tą patį egzempliorių.

2 pavyzdys: Singleton modelio įgyvendinimas su tingiu inicializavimu

Ši demonstracija paaiškina pavienio modelio įgyvendinimą su tingia iniciacija ir parodo jo naudojimą main() funkcijoje. Žingsnis po žingsnio kodo fragmento paaiškinimas pateikiamas po šios programos:

#include

klasės Singletonas {

privatus :

statinis Singletonas * instancija ;

Singletonas ( ) {

std :: cout << „Sukurtas vienas egzempliorius“. << std :: endl ;

}

viešas :

statinis Singletonas * getInstance ( ) {

jeigu ( instancija == nullptr ) {

instancija = naujasis Singletonas ( ) ;

}

grąžinti instancija ;

}

tuštuma rodyti Pranešimą ( ) {

std :: cout << 'Sveiki nuo Singltono!' << std :: endl ;

}

~Singletonas ( ) {

std :: cout << „Singleton egzempliorius sunaikintas“. << std :: endl ;

}

} ;

Singletonas * Singletonas :: instancija = nullptr ;

tarpt pagrindinis ( ) {

Singletonas * singletonInstance1 = Singletonas :: getInstance ( ) ;

singletonInstance1 -> rodyti Pranešimą ( ) ;

Singletonas * singletonInstance2 = Singletonas :: getInstance ( ) ;

singletonInstance2 -> rodyti Pranešimą ( ) ;

grąžinti 0 ;

}

Programa pradedama pridedant antraštės failą, kad būtų galima atlikti įvesties / išvesties užduotis. Tada paskelbiame ir apibrėžiame „Singleton“ klasę. Vienintelis klasės egzempliorius laikomas privačiame statiniame nario kintamajame, pavadintame „instance“.

Kai iškviečiamas „Singleton“ klasės konstruktorius, jis generuoja „Singleton“ klasės egzempliorių. Jis išveda pranešimą „Sukurtas vienas egzempliorius“ į konsolę, naudodamas „std::cout << … << std::endl;“. Konstruktorius neturi jokių parametrų, nes jis yra numatytasis konstruktorius. Jis apibrėžiamas kaip Singleton() be jokių argumentų. Paskelbiame jį kaip privatų, o tai reiškia, kad jį galima iškviesti tik iš klasės vidaus. Tai apsaugo nuo tiesioginio „Singleton“ klasės egzempliorių ir užtikrina, kad vienintelis būdas gauti egzempliorių yra naudojant funkciją getInstance().

„Singleton“ klasės metodas getInstance() deklaruojamas kaip vieša statinė nario funkcija. Ji atlieka vienintelio egzemplioriaus nustatymo ir prieigos suteikimo vaidmenį. GetInstance () jis patikrina, ar egzempliorius yra „nullptr“. Jei taip, tai reiškia, kad egzemplioriaus dar nėra, jis naudoja privatų konstruktorių, kad sukurtų naują „Singleton“ klasės objektą.

Funkcija showMessage() yra paprasta nario funkcija, rodanti 'Sveiki iš Singltono!' žinutę. Apibrėžiamas singletono naikintojas. Jis vadinamas netiesiogiai, kai programa baigiasi ir išspausdina „Singleton egzempliorius sunaikintas“. pranešimas, nurodantis, kad vienkartinis egzempliorius sunaikintas. Statinio nario kintamojo egzempliorius iš pradžių apibrėžiamas kaip „nullptr“.

Int main() pradeda pagrindinės() funkcijos apibrėžimą. Tada „Singleton* singletonInstance1 = Singleton::getInstance();“ iškviečia „Singleton“ klasės funkciją getInstance(), kad gautų žymeklį į vienetinį egzempliorių. Šią žymeklį jis priskiria kintamajam „singletonInstance1“.

Po to „singletonInstance1->showMessage();“ naudoja rodyklės operatorių (->), kad iškviestų funkciją showMessage() ant „singletonInstance1“ žymeklio. Ši funkcija rodo joje nurodytą pranešimą konsolėje. Vėliau „Singleton* singletonInstance2 = Singleton::getInstance();“ dar kartą iškviečia funkciją getInstance(), gaudamas kitą vienkartinio egzemplioriaus rodyklę. Šį kartą jis priskiria žymeklį „singletonInstance2“ kintamajam. „singletonInstance2->showMessage();“ iškviečia funkciją showMessage() rodyklėje „singletonInstance2“. Ši funkcija rodo „Hello from Singleton!“ vėl praneškite į konsolę.

Galiausiai „grįžti 0;“ reiškia main() funkcijos pabaigą, o programa grąžina reikšmę 0, kuri reiškia sėkmingą programos vykdymą.

Štai anksčiau paaiškinto kodo fragmento išvestis:

Šis rezultatas patvirtina, kad „Singleton“ klasė užtikrina tik vieno egzemplioriaus sukūrimą ir kad tolesni iškvietimai į funkciją getInstance() patikimai duoda tą patį egzempliorių.

Išvada

Vieneto kūrimas C++ yra labai naudinga koncepcija. Šiame įraše iš pradžių apžvelgėme „Singleton“ įvado skyrių. Be to, sukurti du pavyzdžiai, kaip įgyvendinti vientoną C++. Pirmoje iliustracijoje parodytas norinčios pavienio inicijavimo įgyvendinimas. Tuo tarpu tingus pavienio modelio inicijavimo įgyvendinimas pateiktas antrajame šio straipsnio pavyzdyje. Be to, atitinkamoms programoms taip pat rodomos pagamintos produkcijos momentinės nuotraukos.