Ako vytvoriť Singleton v C++

Ako Vytvorit Singleton V C



V C++ je singleton princíp návrhu, ktorý zabezpečuje prítomnosť osamelej inštancie triedy v celom programe a poskytuje globálny prístupový bod k tejto konkrétnej inštancii.

Vzor singleton sa bežne používa, keď potrebujete mať jeden zdieľaný prostriedok, ku ktorému by sa mal pristupovať globálne, ako napríklad pripojenie k databáze, zapisovač alebo manažér konfigurácie. Vynútením jedinej inštancie umožňuje viacerým častiam programu pristupovať k rovnakému objektu a upravovať ho, čím podporuje konzistenciu údajov a znižuje potrebu globálnych premenných. Singleton možno použiť ako cache objektov, kde sa často používané alebo drahé objekty ukladajú a opakovane používajú v celej aplikácii. Tento prístup pomáha zlepšiť výkon tým, že sa vyhýba vytváraniu a inicializácii nadbytočných objektov.

V tomto článku si vysvetlíme vytvorenie singletonu a predvedieme príklad štylizácie singletonu v programe C++.







Príklad 1: Vytvorenie jednoduchého singletonu s dychtivou inicializáciou

Jednoduchý singleton s včasnou inicializáciou je návrhový vzor, ​​ktorý zaisťuje, že sa vytvorí iba jedna inštancia triedy a tá sa vytvorí dychtivo počas statickej inicializácie.



Ukážeme si základný úryvok kódu na vytvorenie jednoduchého singletonu s dychtivou inicializáciou. Začnime s programom:



#include

triedy Singleton {
súkromné :
statické Singleton * príklad ;
Singleton ( ) { }
verejnosti :
statické Singleton * getInstance ( ) {
vrátiť príklad ;
}
} ;


Singleton * Singleton :: príklad = nový Singleton ( ) ;

int Hlavná ( ) {

Singleton * singletonInstance1 = Singleton :: getInstance ( ) ;

Singleton * singletonInstance2 = Singleton :: getInstance ( ) ;

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

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

vrátiť 0 ;

}

Kód obsahuje hlavičku , ktorá poskytuje funkcie na prácu so vstupnými a výstupnými prúdmi, ako napríklad „std::cout“.





Po zahrnutí hlavičkového súboru definujeme triedu „Singleton“, ktorá predstavuje implementáciu vzoru singleton. Má súkromný konštruktor a súkromnú statickú členskú premennú s názvom „instance“.

Potom je funkcia getInstance() implementovaná ako verejná statická členská funkcia triedy „Singleton“. Vráti inštanciu singletonu, ktorá je uložená v inštancii statickej členskej premennej. Inštancia statickej členskej premennej je definovaná a inicializovaná mimo triedy pomocou „Singleton* Singleton::instance = new Singleton();“. Tento riadok horlivo inicializuje inštanciu triedy „Singleton“ počas statickej inicializácie.



Vo funkcii main() deklarujeme dva ukazovatele „singletonInstance1“ a „singletonInstance2“ a priradíme hodnotu, ktorá sa vráti volaním funkcie Singleton::getInstance(). Keďže inštancia sa dychtivo inicializuje, oba ukazovatele ukazujú na rovnakú inštanciu. Príkazy „std::cout“ vytlačia adresy pamäte „singletonInstance1“ a „singletonInstance2“ do konzoly pomocou operátora „<<“ a „std::endl“.

Kód končí „návratom 0“, ktorý označuje úspešné vykonanie programu.

Keď spustíte tento kód, výstup je niečo také:

Výstup zobrazuje adresy pamäte „singletonInstance1“ a „singletonInstance2“. Keďže obom ukazovateľom je priradená rovnaká inštancia, ktorá sa získava z funkcie Singleton::getInstance(), majú rovnakú adresu pamäte. Toto ukazuje, ako vzor singleton zaručuje, že existuje jedna inštancia triedy a že budúce volania funkcie getInstance() budú mať vždy za následok rovnakú inštanciu.

Príklad 2: Implementácia jednoduchého vzoru s lenivou inicializáciou

Táto ukážka vysvetľuje implementáciu vzoru singleton s lenivou inicializáciou a ukazuje jej použitie vo funkcii main(). Podrobné vysvetlenie útržku kódu je uvedené po tomto programe:

#include

triedy Singleton {

súkromné :

statické Singleton * príklad ;

Singleton ( ) {

std :: cout << 'Singletonová inštancia bola vytvorená.' << std :: endl ;

}

verejnosti :

statické Singleton * getInstance ( ) {

ak ( príklad == nullptr ) {

príklad = nový Singleton ( ) ;

}

vrátiť príklad ;

}

neplatné showMessage ( ) {

std :: cout << 'Ahoj zo Singletonu!' << std :: endl ;

}

~Singleton ( ) {

std :: cout << 'Singletonová inštancia zničená.' << std :: endl ;

}

} ;

Singleton * Singleton :: príklad = nullptr ;

int Hlavná ( ) {

Singleton * singletonInstance1 = Singleton :: getInstance ( ) ;

singletonInstance1 -> showMessage ( ) ;

Singleton * singletonInstance2 = Singleton :: getInstance ( ) ;

singletonInstance2 -> showMessage ( ) ;

vrátiť 0 ;

}

Program začína pridaním hlavičkového súboru na vykonanie vstupných/výstupných úloh. Potom deklarujeme a definujeme triedu „Singleton“. Jediná inštancia triedy je uložená v súkromnej premennej statického člena s názvom „instance“.

Kedykoľvek sa zavolá konštruktor triedy „Singleton“, vygeneruje inštanciu triedy „Singleton“. Do konzoly vypíše správu „Singleton instance created“ pomocou „std::cout << … << std::endl;“. Konštruktor nemá žiadne parametre, pretože ide o predvolený konštruktor. Je definovaný ako Singleton() bez akýchkoľvek argumentov. Deklarujeme ho ako súkromný, čo znamená, že ho možno vyvolať iba zvnútra triedy. To zabraňuje priamej inštancii triedy „Singleton“ a zaisťuje, že jediný spôsob, ako získať inštanciu, je prostredníctvom funkcie getInstance().

Metóda getInstance() triedy „Singleton“ je deklarovaná ako verejná statická členská funkcia. Je v úlohe zriadenia a poskytnutia prístupnosti jedinej inštancii. Vo vnútri getInstance() skontroluje, či je inštancia „nullptr“. Ak áno, čo znamená, že inštancia ešte nie je prítomná, použije súkromný konštruktor na vytvorenie inštancie nového objektu triedy „Singleton“.

Funkcia showMessage() je jednoduchá členská funkcia, ktorá zobrazuje „Ahoj od Singletona!“ správu. Je definovaný deštruktor singletonu. Volá sa implicitne, keď sa program ukončí a vypíše „Inštancia Singleton zničená“. správu, ktorá indikuje, že inštancia singletonu je zničená. Inštancia statickej členskej premennej je pôvodne definovaná ako „nullptr“.

Funkcia int main() spúšťa definíciu funkcie main(). Potom „Singleton* singletonInstance1 = Singleton::getInstance();“ volá funkciu getInstance() triedy „Singleton“, aby získal ukazovateľ na inštanciu singleton. Tento ukazovateľ priradí premennej „singletonInstance1“.

Potom „singletonInstance1->showMessage();“ používa operátor šípky (->) na volanie funkcie showMessage() na ukazovateli „singletonInstance1“. Táto funkcia zobrazí do konzoly správu, ktorá je v nej špecifikovaná. Potom „Singleton* singletonInstance2 = Singleton::getInstance();“ znova zavolá funkciu getInstance(), čím získa ďalší ukazovateľ na inštanciu singleton. Tentoraz priradí ukazovateľ k premennej „singletonInstance2“. The 'singletonInstance2->showMessage();' volá funkciu showMessage() na ukazovateli „singletonInstance2“. Táto funkcia zobrazí „Ahoj od Singletona!“ správu znova do konzoly.

Nakoniec „návrat 0;“ znamená koniec funkcie main() a program vráti hodnotu 0, čo znamená úspešné vykonanie programu.

Tu je výstup predtým vysvetleného útržku kódu:

Tento výsledok potvrdzuje, že trieda „Singleton“ zabezpečuje vytvorenie len jednej inštancie a že ďalšie volania funkcie getInstance() spoľahlivo prinesú rovnakú inštanciu.

Záver

Vytvorenie singletonu v C++ je veľmi užitočný koncept. V tomto príspevku sme sa spočiatku venovali úvodnej časti singletonu. Okrem toho sú vytvorené dva príklady na implementáciu singletonu v C++. Prvá ilustrácia ukazuje implementáciu dychtivej singletonovej inicializácie. Zatiaľ čo implementácia lenivej inicializácie vzoru singleton je uvedená v druhom príklade tohto článku. Okrem toho sa pre príslušné programy zobrazujú aj snímky vyrobeného výstupu.