Úvod do tvůrčích návrhových vzorů

Úvod

V softwarovém inženýrství popisuje návrhový vzor zavedené řešení nejčastěji se vyskytujících problémů v softwaru design. Představuje osvědčené postupy vyvinuté po dlouhou dobu prostřednictvím pokusů a omylů zkušenými vývojáři softwaru.

Designové vzory získaly popularitu poté, co v roce 1994 vydal Erich Gamma knihu Design Patterns: Elements of Reusable Object-Oriented Software. , John Vlissides, Ralph Johnson a Richard Helm (také známí jako Gang of Four nebo GoF).

V tomto článku prozkoumáme kreační návrhové vzory a jejich typy. Podíváme se také na některé ukázky kódu a diskutujte o situacích, kdy se tyto vzory hodí k našemu designu.

Tvůrčí vzory návrhu

Tvůrčí vzory návrhu se zabývají způsobem, jakým jsou objekty vytvářeny. . Snižují složitost a nestabilitu vytvářením objektů řízeným způsobem.

Nový operátor je často považován za škodlivý, protože rozptyluje objekty po celé aplikaci. Postupem času může být náročné změnit implementaci, protože třídy jsou pevně spojeny.

Vytváření návrhových vzorů řeší tento problém úplným odpojením klienta od skutečného procesu inicializace.

V tomto článku , budeme diskutovat o čtyřech typech Creational Design Pattern:

  1. Singleton – zajišťuje, že v celé aplikaci existuje nanejvýš jedna instance objektu
  2. Factory Method – vytvoří objekty několik souvisejících tříd bez zadání přesného objektu, který má být vytvořen
  3. Abstract Factory – vytváří rodiny souvisejících závislých objektů
  4. Builder – konstruuje složité objekty pomocí přístupu krok za krokem

Pojďme nyní podrobně probrat každý z těchto vzorů.

Návrhový vzor Singleton

Návrhový vzor Singleton si klade za cíl zachovat kontrola inicializace objektů konkrétní třídy zajištěním toho, že v celém virtuálním stroji Java existuje pouze jedna instance objektu.

Třída Singleton také poskytuje jeden jedinečný globální přístupový bod k objektu, takže každé následující volání přístupového bodu vrací pouze tento konkrétní objekt.

3.1. Příklad Singleton Pattern

Ačkoli byl Singletonův vzor zaveden GoF, je známo, že původní implementace je ve vícevláknových scénářích problematická.

Takže tady, my “ budeme se řídit optimálnějším přístupem, který využívá statickou vnitřní třídu:

Zde jsme vytvořili statickou vnitřní třídu, která obsahuje instanci třídy Singleton. Vytvoří instanci pouze tehdy, když někdo zavolá metodu getInstance (), a ne při načtení vnější třídy.

Toto je široce používaný přístup pro třídu Singleton, protože nevyžaduje synchronizaci, je bezpečný pro vlákna , vynucuje línou inicializaci a má srovnatelně méně standardních hodnot.

Také si všimněte, že konstruktor má modifikátor soukromého přístupu. Toto je požadavek na vytvoření Singletonu, protože veřejný konstruktor by znamenal, že by k němu měl kdokoli přístup a mohl začít vytvářet nové instance.

Pamatujte, že toto není původní implementace GoF. Původní verzi naleznete zde propojený článek Baeldung o Singletonech v Javě.

3.2. Kdy použít návrhový vzor Singleton

  • Pro zdroje, jejichž vytvoření je nákladné (například databáze objekty připojení)
  • Je dobrým zvykem udržovat všechny protokoly jako Singletons, což zvyšuje výkon
  • Třídy, které poskytují přístup k nastavení konfigurace aplikace
  • Třídy, které obsahují prostředky, ke kterým se přistupuje ve sdíleném režimu.

Návrhový vzor tovární metody

Vzorový návrh továrního návrhu nebo vzorový návrh tovární metody je jedním z nejpoužívanější návrhové vzory v Javě.

Podle GoF tento vzor „definuje rozhraní pro vytvoření objektu, ale podtřídy mohou rozhodnout, kterou třídu instanovat spojit. Metoda Factory umožňuje třídě odložit instanci na podtřídy. “

Tento vzor deleguje odpovědnost za inicializaci třídy z klienta na konkrétní třídu Factory vytvořením typu virtuálního konstruktoru.

Abychom toho dosáhli, spoléháme na továrnu, která nám poskytuje objekty a skrývá skutečné podrobnosti implementace. K vytvořeným objektům se přistupuje pomocí společného rozhraní.

4.1. Příklad návrhu tovární metody

V tomto příkladu vytvoříme rozhraní Polygon, které bude implementováno několika konkrétními třídami. K načtení objektů z této rodiny bude použita PolygonFactory. :

Nejprve vytvořme rozhraní Polygon:

Dále, vytvoříme několik implementací jako Square, Triangle atd., které implementují toto rozhraní a vrátí objekt typu Polygon.

Nyní můžeme vytvořit továrnu, která vezme počet stran jako argument a vrátí příslušnou implementaci tohoto rozhraní:

Všimněte si, jak se klient může spolehnout, že nám tato továrna poskytne vhodný polygon, aniž byste museli přímo inicializovat objekt.

4.2. Kdy použít návrhový vzor Factory Method

  • Když se očekává častá změna implementace rozhraní nebo abstraktní třídy
  • Když aktuální implementace nemůže pohodlně vyhovět nové změně
  • Když je proces inicializace relativně jednoduchý a konstruktor vyžaduje pouze několik parametrů

Abstraktní vzor návrhu továrny

V předchozí části jsme viděli, jak lze použít návrhový vzor Factory Method k vytvoření objektů souvisejících s jednou rodinou.

Naproti tomu se používá Abstract Factory Design Pattern. k vytvoření rodin souvisejících nebo závislých objektů. Někdy se také nazývá továrna na továrny.

Podrobné vysvětlení najdete v našem výukovém programu Abstract Factory.

Návrhový vzor Builderu

Návrhový vzor Builder je další tvůrčí vzor navržený pro konstrukci poměrně složitých objektů.

Když se složitost vytváření objektu zvýší, vzor Builder může oddělit proces vytváření instancí pomocí jiného objekt (stavitel) pro konstrukci objektu.

Tento stavitel lze poté použít k vytvoření mnoha dalších podobných reprezentací pomocí jednoduchého postupu krok za krokem.

6.1. Příklad

Původní návrhový vzor Builderu zavedený GoF se zaměřuje na abstrakci a je velmi dobrý při práci se složitými objekty, design je však trochu komplikovaný.

Joshua Bloch ve své knize Effective Java představil vylepšenou verzi vzoru stavitele, která je čistá, dobře čitelná (protože využívá plynulý design) a snadno použitelný z pohledu klienta. V tomto příkladu budeme o této verzi diskutovat.

Tento příklad má pouze jednu třídu, BankAccount, která obsahuje stavitel jako statickou vnitřní třídu:

Všimněte si, že všechny modifikátory přístupu v polích jsou prohlášeny za soukromé, protože nechceme, aby k nim přímo přistupovaly vnější objekty.

Konstruktor je také soukromý, takže k němu přiřazený pouze Builder třída má přístup. Všechny vlastnosti nastavené v konstruktoru jsou extrahovány z objektu stavitele, který dodáváme jako argument.

Definovali jsme BankAccountBuilder ve statické vnitřní třídě:

Všimněte si, že jsme deklarovali stejnou sadu polí, která obsahuje vnější třída. Jakákoli povinná pole jsou povinná jako argumenty konstruktoru vnitřní třídy, zatímco zbývající volitelná pole lze určit pomocí metod setter.

Tato implementace také podporuje přístup plynulého designu tím, že metody setteru vrátí stavitele objekt.

Nakonec metoda sestavení zavolá soukromý konstruktor vnější třídy a předá se jako argument. Vrácený BankAccount bude vytvořen v instanci s parametry nastavenými BankAccountBuilder.

Podívejme se na rychlý příklad vzoru stavitele v akci:

6.2. Kdy použít Builder Pattern

  1. Když je proces vytváření objektu extrémně složitý, se spoustou povinných a volitelných parametrů
  2. Když zvýšení počtu parametrů konstruktoru vede k velkému seznamu konstruktorů
  3. Když klient očekává různé reprezentace objektu, který je vytvořen

Závěr

V tomto článku jsme se seznámili s kreačními návrhovými vzory v Javě. Diskutovali jsme také o jejich čtyřech různých typech, tj. Singleton, Factory Method, Abstract Factory a Builder Pattern, jejich výhodách, příkladech a kdy používáme je.

Jako vždy jsou úplné fragmenty kódu k dispozici na GitHubu.

Začněte s Spring 5 a Spring Boot 2 prostřednictvím kurzu Learn Spring:

> > VYZKOUŠEJTE KURZ

Leave a Reply

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *