Singletonin luominen C++:ssa

Singletonin Luominen C Ssa



C++:ssa singleton on suunnitteluperiaate, joka varmistaa luokan yksittäisen esiintymän läsnäolon koko ohjelman ajan ja tarjoaa globaalin yhteyspisteen kyseiselle esiintymälle.

Singleton-mallia käytetään yleisesti, kun tarvitset yksittäisen jaetun resurssin, jota tulisi käyttää maailmanlaajuisesti, kuten tietokantayhteyden, lokerin tai kokoonpanonhallinnan. Pakottamalla yksi ilmentymä, se sallii useiden ohjelman osien käyttää ja muokata samaa objektia, mikä edistää tietojen johdonmukaisuutta ja vähentää globaalien muuttujien tarvetta. Singletonia voidaan käyttää objektivälimuistina, jossa usein käytetyt tai kalliit luotavat objektit tallennetaan ja käytetään uudelleen koko sovelluksen ajan. Tämä lähestymistapa auttaa parantamaan suorituskykyä välttämällä ylimääräisen objektin luomisen ja alustuksen.

Tässä artikkelissa selitämme singletonin luomisen ja näytämme esimerkin singletonin tyylistämisestä C++-ohjelmassa.







Esimerkki 1: Yksinkertaisen singletonin luominen innokkaalla alustuksella

Yksinkertainen singleton, jossa on varhainen alustus, on suunnittelumalli, joka varmistaa, että luokasta luodaan vain yksi esiintymä, ja se luodaan innokkaasti staattisen alustuksen aikana.



Esittelemme peruskoodinpätkän yksinkertaisen singletonin luomiseen innokkaalla alustuksella. Aloitetaan ohjelmasta:



#include

luokan Singleton {
yksityinen :
staattinen Singleton * ilmentymä ;
Singleton ( ) { }
julkinen :
staattinen Singleton * getInstance ( ) {
palata ilmentymä ;
}
} ;


Singleton * Singleton :: ilmentymä = uusi Singleton ( ) ;

int pää ( ) {

Singleton * singletonInstance1 = Singleton :: getInstance ( ) ;

Singleton * singletonInstance2 = Singleton :: getInstance ( ) ;

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

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

palata 0 ;

}

Koodi sisältää -otsikon, joka tarjoaa toiminnot tulo- ja lähtövirtojen, kuten 'std::cout' kanssa.





Kun olet sisällyttänyt otsikkotiedoston, määrittelemme 'Singleton'-luokan, joka edustaa singleton kuvion toteutusta. Siinä on yksityinen rakentaja ja yksityinen staattinen jäsenmuuttuja nimeltä 'instance'.

Sitten getInstance()-funktio toteutetaan 'Singleton'-luokan julkisena staattisena jäsenfunktiona. Se palauttaa singletonin esiintymän, joka on tallennettu staattisen jäsenmuuttujan ilmentymään. Staattisen jäsenen muuttujan esiintymä määritellään ja alustetaan luokan ulkopuolella 'Singleton* Singleton::instance = new Singleton();'. Tämä rivi alustaa 'Singleton'-luokan esiintymän innokkaasti staattisen alustuksen aikana.



Main()-funktiossa määritetään kaksi osoitinta, 'singletonInstance1' ja 'singletonInstance2', ja määritetään arvo, joka palautetaan kutsumalla Singleton::getInstance(). Koska ilmentymä alustetaan innokkaasti, molemmat osoittimet osoittavat samaan ilmentymään. 'std::cout'-käskyt tulostavat 'singletonInstance1'- ja 'singletonInstance2'-muistiosoitteet konsoliin käyttämällä '<<'-operaattoria ja 'std::endl'.

Koodi päättyy 'return 0':iin, mikä osoittaa ohjelman onnistuneen suorituksen.

Kun suoritat tämän koodin, tulos on jotain tällaista:

Tulos näyttää 'singletonInstance1' ja 'singletonInstance2' muistiosoitteet. Koska molemmilla osoittimilla on sama ilmentymä kuin Singleton::getInstance(), niillä on sama muistiosoite. Tämä osoittaa, kuinka singleton malli takaa, että luokassa on yksi esiintymä ja että tulevat getInstance()-kutsut johtavat aina samaan ilmentymään.

Esimerkki 2: Singleton Pattern -toteutus laiskalla alustuksella

Tämä esittely selittää singleton kuvion toteutuksen laiskalla alustuksella ja näyttää sen käytön main()-funktiossa. Koodinpätkän vaiheittainen selitys annetaan tämän ohjelman jälkeen:

#include

luokan Singleton {

yksityinen :

staattinen Singleton * ilmentymä ;

Singleton ( ) {

std :: cout << 'Singleton-instanssi luotu.' << std :: endl ;

}

julkinen :

staattinen Singleton * getInstance ( ) {

jos ( ilmentymä == nullptr ) {

ilmentymä = uusi Singleton ( ) ;

}

palata ilmentymä ;

}

mitätön näytä Viesti ( ) {

std :: cout << 'Hei Singletonista!' << std :: endl ;

}

~Singleton ( ) {

std :: cout << 'Singleton-instanssi tuhottu.' << std :: endl ;

}

} ;

Singleton * Singleton :: ilmentymä = nullptr ;

int pää ( ) {

Singleton * singletonInstance1 = Singleton :: getInstance ( ) ;

singletonInstance1 -> näytä Viesti ( ) ;

Singleton * singletonInstance2 = Singleton :: getInstance ( ) ;

singletonInstance2 -> näytä Viesti ( ) ;

palata 0 ;

}

Ohjelma alkaa lisäämällä otsikkotiedosto syöttö/tulostustehtävien suorittamiseksi. Sitten julistamme ja määrittelemme 'Singleton'-luokan. Luokan ainoa esiintymä säilytetään yksityisessä staattisessa jäsenmuuttujassa nimeltä 'instance'.

Aina kun 'Singleton'-luokan konstruktoria kutsutaan, se luo 'Singleton'-luokan esiintymän. Se tulostaa 'Singleton-instanssi luotu' -viestin konsoliin käyttämällä 'std::cout << … << std::endl;'. Rakentajalla ei ole parametreja, koska se on oletuskonstruktori. Se määritellään nimellä Singleton() ilman argumentteja. Ilmoitamme sen yksityiseksi, mikä tarkoittaa, että sitä voidaan kutsua vain luokan sisältä. Tämä estää 'Singleton'-luokan suoran ilmentämisen ja varmistaa, että ainoa tapa saada ilmentymä on getInstance()-funktio.

'Singleton'-luokan getInstance()-metodi on julkinen staattinen jäsenfunktio. Sen tehtävänä on perustaa ja myöntää pääsy yksittäiselle ilmentymälle. GetInstance()-kohdassa se tarkistaa, onko ilmentymä 'nullptr'. Jos on, mikä tarkoittaa, että ilmentymää ei ole jo olemassa, se käyttää yksityistä konstruktoria 'Singleton'-luokan uuden objektin luomiseen.

ShowMessage()-funktio on yksinkertainen jäsenfunktio, joka näyttää 'Hei Singletonista!' viesti. Singletonin tuhoaja on määritelty. Sitä kutsutaan implisiittisesti, kun ohjelma lopettaa ja tulostaa 'Singleton-instanssi tuhottu'. viesti, joka osoittaa, että yksittäinen ilmentymä on tuhottu. Staattisen jäsenen muuttujan ilmentymä määritellään aluksi nimellä 'nullptr'.

Int main() aloittaa main()-funktion määrittelyn. Sitten 'Singleton* singletonInstance1 = Singleton::getInstance();' kutsuu 'Singleton'-luokan getInstance()-funktiota saadakseen osoittimen singleton-instanssiin. Se määrittää tämän osoittimen 'singletonInstance1'-muuttujalle.

Sen jälkeen 'singletonInstance1->showMessage();' käyttää nuolioperaattoria (->) kutsuakseen showMessage()-funktiota 'singletonInstance1'-osoittimessa. Tämä toiminto näyttää siinä määritetyn viestin konsoliin. Myöhemmin 'Singleton* singletonInstance2 = Singleton::getInstance();' kutsuu getInstance()-funktion uudelleen ja saa toisen osoittimen singleton-instanssiin. Tällä kertaa se määrittää osoittimen 'singletonInstance2'-muuttujalle. 'singletonInstance2->showMessage();' kutsuu showMessage()-funktiota 'singletonInstance2'-osoittimessa. Tämä toiminto näyttää 'Hello from Singleton!' viesti uudelleen konsoliin.

Lopuksi 'palautus 0;' tarkoittaa main()-funktion loppua, ja ohjelma palauttaa arvon 0, joka tarkoittaa ohjelman onnistunutta suoritusta.

Tässä on aiemmin selitetyn koodinpätkän tulos:

Tämä tulos vahvistaa, että 'Singleton'-luokka varmistaa vain yhden ilmentymän luomisen ja että getInstance()-funktion lisäkutsut tuottavat luotettavasti saman ilmentymän.

Johtopäätös

Singletonin luominen C++:ssa on erittäin hyödyllinen käsite. Tässä viestissä käsittelimme aluksi singletonin johdanto-osan. Lisäksi tuotetaan kaksi esimerkkiä singletonin toteuttamiseksi C++:ssa. Ensimmäinen kuva esittää innokkaan singleton-alustuksen toteutusta. Sen sijaan singleton-kuvion laiska alustustoteutus tarjotaan tämän artikkelin toisessa esimerkissä. Lisäksi tuotetun lähdön tilannekuvat näytetään myös vastaaville ohjelmille.