Kā izveidot singletonu programmā C++

Ka Izveidot Singletonu Programma C



C++ valodā singleton ir dizaina princips, kas nodrošina atsevišķas klases eksemplāra klātbūtni visā programmā un nodrošina globālu piekļuves punktu šai konkrētajai instancei.

Singleton modelis parasti tiek izmantots, ja jums ir nepieciešams viens kopīgs resurss, kuram vajadzētu piekļūt globāli, piemēram, datu bāzes savienojumam, reģistrētājam vai konfigurācijas pārvaldniekam. Ieviešot vienu gadījumu, tas ļauj vairākām programmas daļām piekļūt vienam objektam un modificēt to, veicinot datu konsekvenci un samazinot vajadzību pēc globāliem mainīgajiem. Singleton var izmantot kā objektu kešatmiņu, kurā tiek glabāti un atkārtoti izmantoti visā lietojumprogrammā bieži izmantotie vai dārgi veidojamie objekti. Šī pieeja palīdz uzlabot veiktspēju, izvairoties no liekas objektu izveides un inicializācijas.

Šajā rakstā mēs izskaidrosim vienbalsa izveidi un parādīsim piemēru viena toņa stilizēšanai C++ programmā.







1. piemērs: vienkārša singletona izveide ar dedzīgu inicializāciju

Vienkāršs viengabals ar agrīnu inicializāciju ir dizaina modelis, kas nodrošina, ka tiek izveidots tikai viens klases gadījums, un tas tiek izveidots statiskās inicializācijas laikā.



Mēs demonstrēsim pamata koda fragmentu vienkārša viengabala izveidei ar dedzīgu inicializāciju. Sāksim ar programmu:



#include

klases Singletons {
Privāts :
statisks Singletons * piemēram ;
Singletons ( ) { }
publiski :
statisks Singletons * getInstance ( ) {
atgriezties piemēram ;
}
} ;


Singletons * Singletons :: piemēram = jaunais Singletons ( ) ;

starpt galvenais ( ) {

Singletons * singletonInstance1 = Singletons :: getInstance ( ) ;

Singletons * singletonInstance2 = Singletons :: getInstance ( ) ;

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

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

atgriezties 0 ;

}

Kods ietver galveni, kas nodrošina funkcionalitāti darbam ar ievades un izvades straumēm, piemēram, “std::cout”.





Pēc galvenes faila iekļaušanas mēs definējam 'Singleton' klasi, kas apzīmē viena modeļa ieviešanu. Tam ir privāts konstruktors un privāts statisks dalībnieka mainīgais ar nosaukumu “instance”.

Pēc tam funkcija getInstance () tiek ieviesta kā publiska statiska klases “Singleton” dalībnieka funkcija. Tas atgriež viengabala gadījumu, kas tiek glabāts statiskā dalībnieka mainīgā instancē. Statiskā dalībnieka mainīgā instance ir definēta un inicializēta ārpus klases ar “Singleton* Singleton::instance = new Singleton();”. Statiskās inicializācijas laikā šī rindiņa dedzīgi inicializē “Singleton” klases gadījumu.



Funkcijā main() mēs deklarējam divus rādītājus “singletonInstance1” un “singletonInstance2” un piešķiram vērtību, kas tiek atgriezta, izsaucot Singleton::getInstance(). Tā kā gadījums tiek ļoti inicializēts, abas norādes norāda uz vienu un to pašu gadījumu. Paziņojumi “std::cout” drukā “singletonInstance1” un “singletonInstance2” atmiņas adreses konsolē, izmantojot operatoru “<<” un “std::endl”.

Kods beidzas ar “atgriešanās 0”, kas norāda uz veiksmīgu programmas izpildi.

Palaižot šo kodu, izvade ir aptuveni šāda:

Izvade parāda “singletonInstance1” un “singletonInstance2” atmiņas adreses. Tā kā abiem rādītājiem ir piešķirts viens un tas pats gadījums, kas iegūts no Singleton::getInstance(), tiem ir viena un tā pati atmiņas adrese. Tas parāda, kā vienreizējais modelis garantē, ka ir viena klases instance un ka turpmākie getInstance() izsaukumi vienmēr rada vienu un to pašu gadījumu.

2. piemērs: Singleton modeļa ieviešana ar slinku inicializāciju

Šī demonstrācija izskaidro viena modeļa ieviešanu ar slinku inicializēšanu un parāda tā izmantošanu galvenajā () funkcijā. Soli pa solim koda fragmenta skaidrojums tiek sniegts pēc šīs programmas:

#include

klases Singletons {

Privāts :

statisks Singletons * piemēram ;

Singletons ( ) {

std :: cout << 'Izveidota viena instance.' << std :: endl ;

}

publiski :

statisks Singletons * getInstance ( ) {

ja ( piemēram == nullptr ) {

piemēram = jaunais Singletons ( ) ;

}

atgriezties piemēram ;

}

nederīgs parādītZiņojumu ( ) {

std :: cout << 'Sveiks no Singltonas!' << std :: endl ;

}

~Singletons ( ) {

std :: cout << 'Singleton instance iznīcināta.' << std :: endl ;

}

} ;

Singletons * Singletons :: piemēram = nullptr ;

starpt galvenais ( ) {

Singletons * singletonInstance1 = Singletons :: getInstance ( ) ;

singletonInstance1 -> parādītZiņojumu ( ) ;

Singletons * singletonInstance2 = Singletons :: getInstance ( ) ;

singletonInstance2 -> parādītZiņojumu ( ) ;

atgriezties 0 ;

}

Programma sākas, pievienojot galvenes failu, lai veiktu ievades/izvades uzdevumus. Pēc tam mēs deklarējam un definējam 'Singleton' klasi. Vienīgais klases gadījums tiek glabāts privātā statiskā dalībnieka mainīgajā ar nosaukumu “instance”.

Ikreiz, kad tiek izsaukts “Singleton” klases konstruktors, tas ģenerē “Singleton” klases gadījumu. Tas izvada ziņojumu “Singleton instance Created” konsolei, izmantojot “std::cout << … << std::endl;”. Konstruktoram nav parametru, jo tas ir noklusējuma konstruktors. Tas ir definēts kā Singleton () bez argumentiem. Mēs to pasludinām kā privātu, kas nozīmē, ka to var izsaukt tikai no klases iekšpuses. Tas novērš tiešu “Singleton” klases instantiāciju un nodrošina, ka vienīgais veids, kā iegūt gadījumu, ir funkcija getInstance().

Klases “Singleton” metode getInstance() tiek deklarēta kā publiska statiska dalībnieka funkcija. Tā uzdevums ir izveidot un nodrošināt piekļuvi atsevišķai instancei. GetInstance () ietvaros tas pārbauda, ​​vai gadījums ir “nullptr”. Ja tā ir, kas nozīmē, ka instance vēl nepastāv, tā izmanto privāto konstruktoru, lai izveidotu jaunu klases “Singleton” objektu.

Funkcija showMessage() ir vienkārša dalībnieka funkcija, kas parāda 'Hello from Singleton!' ziņa. Singletona iznīcinātājs ir definēts. To sauc netieši, kad programma pārtrauc darbību un izdrukā “Singleton instance iznīcināta”. ziņojums, kas norāda, ka atsevišķais gadījums ir iznīcināts. Statiskā dalībnieka mainīgā instance sākotnēji tiek definēta kā “nullptr”.

Int main () sāk galvenās () funkcijas definīciju. Pēc tam “Singleton* singletonInstance1 = Singleton::getInstance();” izsauc “Singleton” klases funkciju getInstance(), lai iegūtu rādītāju uz vienu instanci. Tas piešķir šo rādītāju mainīgajam “singletonInstance1”.

Pēc tam “singletonInstance1->showMessage();” izmanto bultiņas operatoru (->), lai izsauktu funkciju showMessage() uz rādītāja “singletonInstance1”. Šī funkcija konsolei parāda tajā norādīto ziņojumu. Pēc tam “Singleton* singletonInstance2 = Singleton::getInstance();” vēlreiz izsauc funkciju getInstance(), iegūstot citu rādītāju uz vienreizējo gadījumu. Šoreiz tas piešķir rādītāju mainīgajam “singletonInstance2”. “singletonInstance2->showMessage();” izsauc funkciju showMessage() uz “singletonInstance2” rādītāja. Šī funkcija parāda 'Sveiki no Singltonas!' vēlreiz nosūtīt ziņojumu konsolei.

Visbeidzot, 'atgriezt 0;' apzīmē galvenās () funkcijas beigas, un programma atgriež vērtību 0, kas nozīmē veiksmīgu programmas izpildi.

Šeit ir iepriekš izskaidrotā koda fragmenta izvade:

Šis rezultāts apstiprina, ka 'Singleton' klase nodrošina tikai vienas instances izveidi un ka turpmāki funkcijas getInstance() izsaukumi droši nodrošina to pašu gadījumu.

Secinājums

Singletona izveide programmā C++ ir ļoti noderīgs jēdziens. Šajā ziņojumā mēs sākotnēji apskatījām singleton ievada sadaļu. Turklāt ir izveidoti divi piemēri, lai ieviestu singletonu C++. Pirmajā ilustrācijā parādīta vienaldzīgās inicializācijas ieviešana. Tā kā slinkā modeļa inicializācijas ieviešana ir sniegta šī raksta otrajā piemērā. Turklāt attiecīgajām programmām tiek parādīti arī saražotās produkcijas momentuzņēmumi.