Sadržaj:

Kako napraviti singleton dizajn uzorak u C ++: 9 koraka
Kako napraviti singleton dizajn uzorak u C ++: 9 koraka

Video: Kako napraviti singleton dizajn uzorak u C ++: 9 koraka

Video: Kako napraviti singleton dizajn uzorak u C ++: 9 koraka
Video: C#. Паттерн Singleton. Урок 40 2024, Jun
Anonim
Kako napraviti Singleton dizajn uzorak u C ++
Kako napraviti Singleton dizajn uzorak u C ++

Uvod:

Svrha ovog vodiča za upute je poučiti korisnika o tome kako implementirati singleton dizajn uzorak u svoj C ++ program. Pritom će ovaj skup uputa također objasniti čitatelju zašto su elementi singletona takvi kakvi jesu i kako se kôd obrađuje. Znajući to, pomoći će vam u budućnosti u otklanjanju grešaka u vašim budućim singletoncima. Šta je obrazac singleton dizajna? Uzorak singleton dizajna je uzorak dizajna u kojem koder stvara klasu koja se može instalirati samo jednom, javnim funkcijama klasa se u osnovi može pristupiti bilo gdje, pod uvjetom da ste #included datoteku zaglavlja u drugim datotekama vezanim za projekt.

Obrazac pojedinačnog dizajna je obrazac dizajna koji se mora znati za svakog objektno orijentisanog programera, programera i programera. Uzorak singleton dizajna također je jedan od najjednostavnijih dizajnerskih uzoraka kodiranja. Njegovo učenje može vam pomoći da naučite druge, teže dizajnerske obrasce u budućnosti. Također vam može pomoći da pojednostavite kôd svog programa na načine za koje niste mislili da su mogući.

Iako je poteškoća singleton dizajna jednostavna u usporedbi s drugim dizajnerskim uzorcima, ovaj skup uputa ima srednju poteškoću. To znači da za izvršavanje ovih uputa preporučujemo da poznajete osnovne i napredne zahtjeve sintakse za C ++. Trebali biste također znati pravilnu etiketu kodiranja C ++ (tj. Neka varijable klase budu privatne, jedna klasa po datoteci zaglavlja itd.). Trebali biste znati i kako osloboditi memoriju te kako konstruktori i destruktori rade u C ++.

Ovaj vodič će trajati u prosjeku oko 10-15 minuta.

Materijalni zahtevi:

-Računalo (može biti PC ili Mac) koje može pokrenuti Visual Studios (bilo koja verzija)

-Jednostavan program, kreiran u Visual Studiosu, s kojim možete testirati svoj singleton

Napomena: Jednostruki uzorak dizajna može se izvesti na bilo kojem drugom C ++ podržanom IDE -u ili kodirajućem sučelju, ali za ovaj skup uputa koristit ćemo Visual Studios Enterprise Edition.

Korak 1: Kreirajte svoju klasu s datotekom zaglavlja i CPP datotekom

Kreirajte svoj razred s datotekom zaglavlja i CPP datotekom
Kreirajte svoj razred s datotekom zaglavlja i CPP datotekom
Kreirajte svoj razred s datotekom zaglavlja i CPP datotekom
Kreirajte svoj razred s datotekom zaglavlja i CPP datotekom

Da biste stvorili ove dvije datoteke i klasu odjednom, otvorite svoj projekt / program u Visual Studiosu, prijeđite na istraživač rješenja, kliknite desnim tasterom miša i okvir bi se trebao pojaviti u blizini kursora miša, pronađite opciju „Dodaj“, zadržite pokazivač miša iznad njega, a drugi okvir bi se trebao pojaviti s desne strane. U ovom okviru želite pronaći opciju „Nova stavka..“, kliknite na nju i trebao bi se pojaviti prozor sličan slici 1.1. U ovom prozoru želite odabrati “C ++ Class”, a zatim pritisnuti “Add”. Ovo će otvoriti još jedan prozor koji liči na sliku sa fotografije 1.2. U ovom prozoru upisujete naziv svoje klase u polje “Naziv klase” i Visual Studios će automatski imenovati stvarnu datoteku nakon imena klase. U svrhu ove upute, nazvat ćemo našu klasu “EngineDebugSingleton”, ali to može biti bilo koje ime zasnovano na slovima. Sada možete pritisnuti „OK“i preći na korak 2.

Napomena: Istraživač rješenja i gdje se datoteke drže na vašem računaru su odvojene. Premještanjem ili stvaranjem bilo čega u istraživaču rješenja nećete premjestiti ili organizirati datoteke u vašem istraživaču datoteka OS. Siguran način organiziranja datoteka na strani istraživača datoteka bio bi uklanjanje, ali ne i brisanje određenih datoteka iz istraživača rješenja, premještanje istih datoteka u istraživaču datoteka na željenu lokaciju, a zatim povratak na istraživač rješenja, desni klik, pronađite opciju "Dodaj", zatim pronađite "Postojeću stavku" i pronađite datoteke koje ste premjestili. Premjestite i zaglavlje i cpp datoteku.

Korak 2: Postavite Konstruktor na Privatno

Konstruktor postavite na Privatno
Konstruktor postavite na Privatno

S novostvorenom CPP datotekom i datotekom zaglavlja, ako se nisu otvorile automatski kada ste je stvorili, idite na istraživač rješenja i kliknite i otvorite “EngineDebugSingleton.h”. Tada ćete biti dočekani sa “EngineDebugSingleton ()”, zadanim konstruktorom klase i “~ EngineDebugSingleton ()” destruktorom klase. Za ovaj korak ćemo htjeti postaviti konstruktor na privatno, što znači da je ova funkcija dostupna samo klasi i ništa drugo. S ovim nećete moći napraviti varijablu ili dodijeliti klasu u memoriju izvan klase, samo u datoteci zaglavlja klase i ostalim funkcijama klasa. Privatnost konstruktora ključna je za obrazac dizajna i način rada singletona. U budućim koracima otkrit ćemo kako se pojedinačni instancira i pristupa.

Klasa bi sada trebala izgledati ovako nakon premještanja konstruktora u privatnu (pogledajte povezanu fotografiju)

Korak 3: Postavite Destructor na Privatno

Postavite Destructor na Privatno
Postavite Destructor na Privatno

Kao što smo učinili sa konstruktorom u

korak 2, za ovaj korak, sada ćemo destruktor postaviti na privatno. Kao i kod konstruktora, ništa osim same klase neće moći izbrisati sve varijable klase iz memorije.

Klasa bi sada trebala izgledati ovako nakon završetka ovog koraka. (Pogledajte pridruženu fotografiju)

Korak 4: Kreiranje varijable statičkog pokazivača u Singletonu

Kreiranje varijable statičkog pokazivača u Singletonu
Kreiranje varijable statičkog pokazivača u Singletonu

U ovom koraku stvorit ćemo

varijabla statičkog pokazivača tipa “EngineDebugSingleton*”. Ovo će biti varijabla koja će se koristiti za dodjeljivanje našeg singletona memoriji i pokazat će na nju sve vrijeme dok je naš singleton dodijeljen memoriji.

Ovako bi naša zaglavna datoteka trebala izgledati nakon stvaranja ove varijable

Korak 5: Kreiranje Instance funkcije

Kreiranje Instance funkcije
Kreiranje Instance funkcije

Sada želimo napraviti instancu

funkciju. Funkcija će morati biti statička funkcija i htjet će vratiti referencu našoj klasi (“EngineDebugSingleton &”). Našu funkciju smo pozvali Instance (). U samoj funkciji ćemo htjeti prvo testirati je li ptrInstance == nullptr (može se skratiti na! PtrInstance), ako je nullptr, to znači da singleton nije dodijeljen i u opsegu if naredbe, mi ćemo želite dodijeliti radeći ptrInstance = new EngineDebugSingleton (). Ovdje zapravo dodjeljujete singleton memoriji. Nakon izlaska iz opsega naredbe if, vratit ćemo ono na što pokazuje ptrInstance, što je označeno sintaksom “*ptrInstance”. Ovu ćemo funkciju jako koristiti pri izradi statičkih javnih funkcija, tako da možemo provjeriti je li singleton kreiran i dodijeljen memoriji. U suštini, ova funkcija čini tako da možete imati samo jednu dodjelu klase i ne više.

Ovako bi naša klasa trebala izgledati sada nakon kreiranja funkcije Instance (). Kao što vidite, sve što smo uradili ostalo je u privatnom odjeljenju razreda, ovo će se malo promijeniti u sljedećih nekoliko koraka.

Korak 6: Kreiranje statičkih javnih funkcija

Kreiranje statičkih javnih funkcija
Kreiranje statičkih javnih funkcija
Kreiranje statičkih javnih funkcija
Kreiranje statičkih javnih funkcija
Kreiranje statičkih javnih funkcija
Kreiranje statičkih javnih funkcija

Nakon što ste napravili funkciju iz

korak 5, možete početi stvarati statičke javne funkcije. Svaka javna funkcija trebala bi imati privatnu funkciju koja ide uz nju, naziv ove funkcije ne može biti isti. Zašto funkciju učiniti statičnom? Javne funkcije činimo statičkim tako da im se može pristupiti bez stvarnog objekta. Dakle, umjesto da radimo nešto poput “EngineDebugSingleObj-> SomeFunction ()”, radimo “EngineDebugSingleton:: Some Function ()”. Ovo omogućava da se singletonu pristupa u osnovi bilo gdje u kodu, pod uvjetom da ste #uključili datoteku zaglavlja u određenu datoteku projekta s kojom radite. Ovim možete stvoriti singl pomoću bilo koje od njegovih javnih funkcija.

Za naše svrhe u ovom koraku stvorili smo dvije javne statičke funkcije void, “add ()” i “subtract ()”. U privatnom odjeljku imamo još dvije funkcije, “PrivAdd ()” i “PrivSubtract ()”. Dodali smo i int varijablu pod nazivom “NumberOfThings”. Definicija ovih funkcija ući će u CPP datoteku naših klasa. Da biste jednostavno unijeli funkciju u CPP datoteku, označite kursorom funkciju koja bi trebala imati zelenu liniju ispod i pritisnite "Lijevo ALT + ENTER", to će vam dati mogućnost da stvorite definiciju u klase povezane CPP datoteke. Pogledajte Fotografiju 6.1 da vidite kako bi datoteka zaglavlja trebala izgledati, a nakon što ste stvorili sve definicije funkcija, CPP bi trebao izgledati kao Fotografija 6.2, osim što definicije funkcija neće imati kôd.

Sada ćete htjeti dodati isti kôd kao na fotografiji 6.2 u svoje definicije funkcija. Kao što je ranije rečeno, naše javne funkcije će koristiti funkciju Instance (), koja će vratiti ono na šta ptrInstance pokazuje. To nam omogućava pristup privatnim funkcijama naše klase. Sa bilo kojom singleton javnom funkcijom, trebali biste pozivati samo tu Instance funkciju. Jedini izuzetak je naša funkcija Terminate.

Napomena: Točne javne i privatne funkcije prikazane u ovom koraku nisu potrebne, u privatnoj funkciji možete imati različite nazive funkcija i operacije, ali za bilo koju vrstu javne funkcije trebate imati privatnu funkciju koja ide uz nju i javna funkcija bi uvijek trebala koristiti, u našem slučaju, funkciju Instance ().

Korak 7: Kreiranje funkcije prekidanja

Kreiranje funkcije prekidanja
Kreiranje funkcije prekidanja
Kreiranje funkcije prekidanja
Kreiranje funkcije prekidanja

Budući da možemo samo osloboditi naš singleton iz memorije u našoj klasi, moramo stvoriti statičku javnu funkciju. Ova funkcija će pozvati delete na ptrInstance, koji poziva destruktor klase, a zatim ćemo htjeti vratiti ptrInstance na nullptr tako da se može ponovo dodijeliti ako se vaš program ne završi. Također ćete htjeti prekinuti Singletons da biste očistili dodijeljenu memoriju koju ste dodijelili bilo kojoj Singletonovoj privatnoj varijabli.

Korak 8: Postavljanje PtrInstance na Nullptr

Postavljanje PtrInstance na Nullptr
Postavljanje PtrInstance na Nullptr

Da biste dovršili svoj singleton, želite prijeći na datoteku EngineDebugSingleton. CPP i na vrhu CPP datoteke, u našem slučaju, upišite “EngineDebugSingleton* EngineDebugSingleton:: ptrInstance = nullptr.”

Ovo će početno postaviti ptrInstance na nullptr, pa kada prvi put prođete kroz funkciju instance, našoj klasi će biti dozvoljeno dodjeljivanje memoriji. Bez toga ćete najvjerojatnije dobiti grešku jer ćete pokušati pristupiti memoriji koja joj nema ništa dodijeljeno.

Korak 9: Test i zaključak

Test i zaključak
Test i zaključak

Sada ćemo htjeti testirati naš singleton kako bismo bili sigurni da radi, to će uključivati pozivanje javnih funkcija kao što je opisano u koraku 6 i preporučujemo vam da postavite prekidne točke za prolazak kroz vaš kôd i provjerite radi li singleton kao to bi trebao biti. Naše polazište bit će u main.cpp našeg projekta, a main.cpp sada izgleda kao na slici ispod.

Čestitamo! Upravo ste dovršili svoju prvu implementaciju Singleton Design Pattern -a. S ovim dizajnerskim uzorkom sada možete pojednostaviti svoj kôd na različite načine. Na primjer, sada možete napraviti sisteme menadžera koji rade tokom vremena izvođenja vašeg programa, a kojima se može pristupiti putem statičkih funkcija bilo gdje gdje ste uključili klasu.

Vaša posljednja datoteka zaglavlja trebala bi izgledati kao fotografija 7.1. Povezana CPT datoteka vašeg singletona trebala bi izgledati kao fotografija 6.2 s dodatkom, na vrhu datoteke, koda prikazanog u koraku 8. Ovo vam je uputstvo pružilo jednostavnu strukturu Singleton Design Pattern -a.

Savjeti za rješavanje problema:

Dobivate li greške povezane s memorijom?

Obavezno pogledajte korake 7 i 8 da biste bili sigurni da ptrInstance postavljate na nullptr.

Dolazi do beskonačne petlje?

Uvjerite se da za javne funkcije u njihovim definicijama pozivate privatnu funkciju, a ne istu javnu funkciju.

Objekti dodijeljeni unutar singletona uzrokuju curenje memorije?

Pobrinite se da pozovete završnu funkciju vašeg singletona kada je to potrebno u vašem programskom kodu, a u destruktoru vašeg singletona, pobrinite se da de-alocirate sve objekte koji su dodijeljeni memoriji unutar opsega singleton koda.