Obsah:

Jak udělat vzor návrhu Singleton v C ++: 9 kroků
Jak udělat vzor návrhu Singleton v C ++: 9 kroků

Video: Jak udělat vzor návrhu Singleton v C ++: 9 kroků

Video: Jak udělat vzor návrhu Singleton v C ++: 9 kroků
Video: SINGLETONS in C++ 2024, Listopad
Anonim
Jak udělat vzor návrhu Singleton v C ++
Jak udělat vzor návrhu Singleton v C ++

Úvod:

Účelem této instrukční příručky je naučit uživatele, jak implementovat vzor návrhu singletonu do jejich programu C ++. Přitom tato instrukční sada čtenáři také vysvětlí, proč jsou prvky singletonu takové, jaké jsou a jak je kód zpracován. Vědět to, pomůže v budoucnosti s laděním vašich budoucích singletonů. Jaký je designový vzor singleton? Vzorec návrhu singletonu je návrhový vzor, kde kodér vytvoří třídu, kterou lze vytvořit pouze jednou, k veřejným funkcím tříd lze v zásadě přistupovat kdekoli, za předpokladu, že #zahrnete soubor záhlaví do jiných souborů souvisejících s projektem.

Vzorec návrhu singletonu je nezbytným návrhovým vzorem pro každého objektově orientovaného programátora, softwarových programátorů a herních programátorů. Vzorec singletonového designu je také jedním z nejjednodušších návrhových vzorů kódování. Naučit se to vám může v budoucnu pomoci naučit se další, obtížnější, návrhové vzory. Může vám také pomoci zefektivnit kód vašeho programu způsoby, o kterých jste si nemysleli, že je to možné.

Obtížnost návrhového vzoru singletonu je ve srovnání s jinými návrhovými vzory snadná, ale tato instrukční sada má střední obtížnost. To znamená, že k provedení těchto pokynů doporučujeme znát základní a pokročilé požadavky na syntaxi jazyka C ++. Měli byste také znát správnou etiketu kódování C ++ (tj. Ponechat proměnné třídy soukromé, jednu třídu na soubor záhlaví atd.). Měli byste také vědět, jak uvolnit paměť a jak konstruktory a destruktory fungují v C ++.

Tato příručka zabere v průměru přibližně 10–15 minut.

Materiálové požadavky:

-Počítač (může být PC nebo Mac), na kterém lze spustit Visual Studios (libovolná verze)

-Jednoduchý program vytvořený v aplikaci Visual Studios, pomocí kterého můžete otestovat svůj singleton

Poznámka: Vzor návrhu singletonu lze provést na jakémkoli jiném rozhraní IDE nebo kódování podporujícím C ++, ale pro tuto sadu instrukcí použijeme Visual Studios Enterprise Edition.

Krok 1: Vytvořte svou třídu se souborem záhlaví a souborem CPP

Vytvořte svou třídu se souborem záhlaví a souborem CPP
Vytvořte svou třídu se souborem záhlaví a souborem CPP
Vytvořte svou třídu se souborem záhlaví a souborem CPP
Vytvořte svou třídu se souborem záhlaví a souborem CPP

Chcete -li vytvořit tyto dva soubory a třídu najednou, otevřete projekt / program v aplikaci Visual Studios, přejděte na průzkumníka řešení, klikněte pravým tlačítkem a poblíž kurzoru myši se zobrazí pole, najděte možnost „Přidat“, najeďte myší nad ním a napravo by se mělo objevit další pole. V tomto poli chcete najít možnost „Nová položka..“, kliknout na ni a mělo by se objevit okno připomínající níže uvedený obrázek 1.1. V tomto okně chcete vybrat „C ++ Class“a poté kliknout na „Add“. Tím se otevře další okno, které se podobá obrázku 1.2. V tomto okně zadáte název své třídy do pole „Název třídy“a aplikace Visual Studios automaticky pojmenuje skutečný soubor za názvem třídy. Pro účely této instrukce pojmenujeme naši třídu „EngineDebugSingleton“, ale může to být libovolné jméno založené na písmenech. Nyní můžete stisknout „OK“a pokračovat ke kroku 2.

Poznámka: Průzkumník řešení a to, kde jsou soubory uloženy ve vašem počítači, jsou oddělené. Přesunutím nebo vytvořením čehokoli v Průzkumníku řešení se nepřesunou ani neuspořádají soubory v Průzkumníku souborů OS. Bezpečný způsob, jak organizovat soubory na straně Průzkumníka souborů, by byl odebrat, ale neodstranit konkrétní soubory z Průzkumníka řešení, přesunout stejné soubory v Průzkumníku souborů na požadované místo a poté se vrátit zpět do Průzkumníka řešení, pravým tlačítkem myši, najděte možnost „Přidat“, poté najděte „Existující položka“a najděte soubory, které jste přesunuli. Přesuňte soubor záhlaví i soubor cpp.

Krok 2: Nastavte Konstruktor na Soukromý

Nastavte Konstruktor na Soukromý
Nastavte Konstruktor na Soukromý

Pokud se váš nově vytvořený soubor CPP a soubor záhlaví neotevřel automaticky, když jste jej vytvořili, přejděte do Průzkumníka řešení a klikněte a otevřete „EngineDebugSingleton.h“. Poté vás uvítá „EngineDebugSingleton ()“, výchozí konstruktor třídy a „~ EngineDebugSingleton ()“destruktor třídy. V tomto kroku budeme chtít nastavit konstruktor na soukromý, to znamená, že tato funkce je k dispozici pouze pro třídu a nic jiného. Díky tomu nebudete moci vytvořit proměnnou ani alokovat třídu do paměti mimo třídu, pouze v hlavičkovém souboru tříd a dalších funkcích tříd. Soukromý konstruktor je klíčem k návrhu a fungování singletonů. V budoucích krocích zjistíme, jak je vytvořen instanci a přístup k jednotlivci.

Po přesunutí konstruktoru do soukromého stavu by nyní třída měla vypadat takto (Podívejte se na přidruženou fotografii)

Krok 3: Nastavte Destructor na Private

Nastavte Destructor na Private
Nastavte Destructor na Private

Stejně jako jsme to udělali s konstruktorem v

krok 2, v tomto kroku nyní nastavíme destruktor na soukromý. Stejně jako u konstruktoru nebude nic, kromě samotné třídy, schopno odstranit všechny proměnné třídy z paměti.

Po dokončení tohoto kroku by nyní třída měla vypadat takto. (Viz přidružená fotka)

Krok 4: Vytvoření proměnné statického ukazatele v Singletonu

Vytvoření proměnné statického ukazatele v Singletonu
Vytvoření proměnné statického ukazatele v Singletonu

V tomto kroku vytvoříme a

proměnná statického ukazatele typu „EngineDebugSingleton*“. Toto bude proměnná, která bude použita alokovat náš singleton do paměti a bude na něj ukazovat po celou dobu, kdy je náš singleton přidělen do paměti.

Takto by měl vypadat náš záhlaví po vytvoření této proměnné

Krok 5: Vytvoření funkce instance

Vytvoření funkce instance
Vytvoření funkce instance

Nyní chceme vytvořit instanci

funkce. Funkce bude muset být statickou funkcí a bude chtít vrátit odkaz na naši třídu („EngineDebugSingleton &“). Naší funkci jsme nazvali Instance (). V samotné funkci budeme chtít nejprve otestovat, zda ptrInstance == nullptr (lze zkrátit na! PtrInstance), pokud je nullptr, znamená to, že singleton nebyl přidělen a v rozsahu příkazu if budeme chcete přidělit provedením ptrInstance = new EngineDebugSingleton (). Zde skutečně přidělíte singleton do paměti. Po ukončení rozsahu příkazu if vrátíme to, na co ptrInstance ukazuje, což je označeno syntaxí „*ptrInstance“. Tuto funkci budeme hojně používat při vytváření našich statických veřejných funkcí, abychom mohli zkontrolovat, zda byl singleton vytvořen a přidělen do paměti. Tato funkce to v podstatě dělá, takže můžete mít pouze jedno přidělení třídy a žádné další.

Tak by teď měla vypadat naše třída po vytvoření funkce Instance (). Jak vidíte, všechno, co jsme udělali, zůstalo v soukromé části třídy, v následujících několika krocích se to trochu změní.

Krok 6: Vytváření statických veřejných funkcí

Vytváření statických veřejných funkcí
Vytváření statických veřejných funkcí
Vytváření statických veřejných funkcí
Vytváření statických veřejných funkcí
Vytváření statických veřejných funkcí
Vytváření statických veřejných funkcí

Poté, co jste provedli funkci z

krok 5, můžete začít vytvářet statické veřejné funkce. Každá veřejná funkce by měla mít svoji soukromou funkci, název této funkce nemůže být stejný. Proč nastavit funkci statickou? Veřejné funkce děláme statické, aby k nim bylo možné přistupovat bez skutečného objektu. Místo toho, abychom dělali něco jako „EngineDebugSingleObj-> SomeFunction ()“, děláme „EngineDebugSingleton:: Some Function ()“. To umožňuje přístup k jednotlivci v zásadě kdekoli v kódu za předpokladu, že #zahrnete soubor záhlaví do konkrétního souboru projektu, se kterým pracujete. Díky tomu můžete také vytvořit singlet prostřednictvím jakékoli z jeho veřejných funkcí.

Pro naše účely jsme v tomto kroku vytvořili dvě veřejné statické prázdné funkce „add ()“a „subtract ()“. V soukromé sekci máme další dvě funkce, „PrivAdd ()“a „PrivSubtract ()“. Přidali jsme také proměnnou int s názvem „NumberOfThings“. Definice těchto funkcí přejde do souboru CPP našich tříd. Aby se funkce snadno dostala do souboru CPP, zvýrazněte pomocí kurzoru funkci, která by měla mít pod sebou zelenou čáru, a stiskněte „Left ALT + ENTER“, což vám poskytne možnost vytvořit definici v tříd přidružený soubor CPP. Podívejte se na fotografii 6.1, abyste viděli, jak by měl vypadat soubor záhlaví, a poté, co vytvoříte všechny definice funkcí, by váš CPP měl vypadat jako na fotografii 6.2 s tím rozdílem, že vaše definice funkcí v sobě nebudou mít žádný kód.

Nyní budete chtít do definic funkcí přidat stejný kód jako na fotografii 6.2. Jak již bylo uvedeno dříve, naše veřejné funkce budou využívat funkci Instance (), která vrátí to, na co ptrInstance ukazuje. To nám umožňuje přístup k soukromým funkcím naší třídy. S jakoukoli veřejnou funkcí jakéhokoli singletonu byste měli volat pouze tuto instanci. Jedinou výjimkou je naše funkce Ukončit.

Poznámka: Přesné veřejné a soukromé funkce zobrazené v tomto kroku nejsou nutné, v soukromé funkci můžete mít různé názvy funkcí a operace, ale pro jakýkoli typ veřejné funkce byste s ní měli mít soukromou funkci a veřejná funkce by měla vždy používat, v našem případě, funkci Instance ().

Krok 7: Vytvoření funkce ukončení

Vytvoření funkce ukončení
Vytvoření funkce ukončení
Vytvoření funkce ukončení
Vytvoření funkce ukončení

Vzhledem k tomu, že náš singleton můžeme z naší třídy uvolnit pouze z paměti, musíme vytvořit statickou veřejnou funkci. Tato funkce zavolá delete na ptrInstance, která volá destruktor třídy a poté budeme chtít nastavit ptrInstance zpět na nullptr, aby ji bylo možné znovu přidělit, pokud váš program nekončí. Také budete chtít ukončit své Singletony, abyste vyčistili veškerou přidělenou paměť, kterou jste přidělili v soukromých proměnných jakékoli Singleton.

Krok 8: Nastavení PtrInstance na Nullptr

Nastavení PtrInstance na Nullptr
Nastavení PtrInstance na Nullptr

Chcete -li svůj singleton dokončit, přejděte do souboru EngineDebugSingleton. CPP a v horní části souboru CPP v našem případě zadejte „EngineDebugSingleton* EngineDebugSingleton:: ptrInstance = nullptr“.

Tím se zpočátku nastaví ptrInstance na nullptr, takže když poprvé projdete funkcí instance poprvé, bude naše třída povolena alokována do paměti. Bez něj se s největší pravděpodobností zobrazí chyba, protože se budete pokoušet o přístup k paměti, které k ní není nic přiděleno.

Krok 9: Test a závěr

Test a závěr
Test a závěr

Nyní budeme chtít otestovat, že náš singleton zajistí, aby fungoval. To bude zahrnovat volání veřejných funkcí, jak je popsáno v kroku 6, a doporučujeme, abyste nastavili zarážky pro procházení kódu a abyste zjistili, že singleton funguje jako to by mělo být. Náš výchozí bod bude v main.cpp našeho projektu a náš main.cpp nyní vypadá jako na obrázku níže.

Gratulujeme! Právě jste dokončili svou první implementaci vzorového vzoru Singleton. S tímto návrhovým vzorem nyní můžete svůj kód zefektivnit různými způsoby. Nyní například můžete vytvořit manažerské systémy, které fungují po celou dobu běhu vašeho programu a ke kterým lze přistupovat prostřednictvím statických funkcí kdekoli, kam jste třídu zahrnuli.

Váš konečný soubor záhlaví by měl vypadat jako na fotografii 7.1. Soubor CPP přidružený k vašemu singletonu by měl vypadat jako na fotografii 6.2 s přidáním kódu zobrazeného v kroku 8 v horní části souboru. Tato instrukce vám poskytla jednoduchou strukturu návrhového vzoru Singleton.

Poradce při řešení potíží:

Zobrazují se chyby související s pamětí?

Zkontrolujte krok 7 a krok 8, abyste se ujistili, že nastavujete ptrInstance na nullptr.

Vyskytuje se nekonečná smyčka?

Ujistěte se, že veřejné funkce v jejich definicích voláte soukromou funkci, nikoli stejnou veřejnou funkci.

Objekty přidělené v rámci singletonu způsobující úniky paměti?

Ujistěte se, že voláte funkci ukončení vašeho singletonu, je-li to vhodné v rámci vašeho programového kódu, a v destruktoru vašeho singletonu se ujistěte, že zrušíte alokaci všech objektů, které byly přiděleny do paměti v rámci kódu singletonu.