design patterns java
V tomto kurzu probereme návrhové vzory v Javě. Budeme studovat vzory Singleton, Factory a Builder s příklady a výhodami:
Když řešíme konkrétní problém, můžeme jej vyřešit efektivněji, pokud již máme definovány některé osvědčené postupy. To nám skutečně pomůže dodržovat tyto osvědčené postupy a vyvíjet spolehlivější řešení.
Tyto osvědčené postupy které lze použít k vývoji osvědčená řešení pro řešení problémů se nazývají „ Designové vzory “. Zkušení vývojáři softwaru OOP používají k řešení konkrétních úkolů návrhové vzory.
=> Prohlédněte si příručku Java Beginners Guide zde
Co se naučíte:
Návrhové vzory v Javě
Designové vzory poprvé vynalezl Christopher Alexander v roce 1977. Později však čtyři vývojáři, jmenovitě Erich Gamma, Richard Helm, John Vlissides a Ralph Johnson, napsali knihu s názvem „ Gang vzorů čtyř návrhů, prvky opakovaně použitelného objektově orientovaného softwaru „V roce 1995.
Od té doby byly všechny návrhové vzory známé jako „ Gang čtyř návrhových vzorů “.
youtube na mp3 déle než 30 minut
Návrhové vzory jsou nezávislé na jakýchkoli programovacích jazycích, protože se používají k řešení běžných objektově orientovaných návrhových problémů a nejsou omezeny pouze na konkrétní programovací jazyk. V zásadě je to tedy nápad, nikoli implementace.
Pomocí návrhových vzorů tedy můžeme vyvíjet programy, které jsou efektivnější, flexibilnější, udržovatelné a opakovaně použitelné.
Výhody návrhových vzorů
Níže jsou uvedeny některé výhody používání návrhových vzorů v našich aplikacích:
- Návrhové vzory jsou opakovaně použitelné a lze je použít pro více projektů.
- Můžeme definovat architekturu systému pomocí návrhových vzorů.
- Návrhové vzory poskytují průhlednost návrhu aplikace.
- Návrhové vzory jsou již osvědčené a ověřené, abychom je mohli bez obav používat.
- Návrhové vzory nám umožňují budovat lepší systémy a také zajišťují jasnost v architektuře systému.
Kdy použít návrhové vzory
Kdy bychom tedy měli přesně použít návrhové vzory?
Obvykle používáme návrhový vzor během počáteční fáze analýzy a požadavků SDLC (Software Development Life Cycle). Při použití během fáze analýzy a požadavku SDLC poskytuje více informací k této fázi. Java interně podporuje návrhové vzory.
Návrhové vzory v Javě jsou kategorizovány takto:
Pokud jde o tento tutoriál, zajímáme se pouze o kreační návrhové vzory.
Kreační návrhové vzory jsou dále klasifikovány následovně:
V tomto kurzu probereme následující návrhové vzory:
- Singleton návrhový vzor
- Tovární návrhový vzor
- Tvůrce návrhový vzor
Začněme singletonovým vzorem v Javě.
Doporučené čtení = >> Návrhové vzory pro aplikace založené na baňkách
Singleton vzor v Javě
Singleton pattern je typ kreačního vzoru v Javě. Singleton pattern je návrhový vzor, ve kterém je na virtuálním stroji Java přítomna pouze jedna instance třídy. Třída singleton (implementující vzor singleton) musí poskytnout globální přístupový bod, aby získala instanci třídy.
Jinými slovy, singletonový vzor omezuje vytváření instancí třídy. Singleton vzor se používá při implementaci loggeru pro aplikace. Používá se také při implementaci fondu vláken nebo mezipaměti.
Třídy Java, java.awt.Desktop a java.lang.runtime také použijte singletonový vzor.
Výhody
- Protože se používá pouze jedna instance třídy singleton, šetříme paměť.
- Zajišťuje také opakovanou použitelnost, protože se znovu a znovu používá stejný singletonový objekt.
Nyní pojďme k implementaci singletonového vzoru.
Implementace Singletonova vzoru
Jak již bylo zmíněno, návrhový vzor singleton omezuje třídu pouze s jednou instancí a této instanci je udělen globální přístupový bod. To byly všechny třídy, které odkazují na stejný objekt znovu a znovu.
Následující diagram UML vysvětluje vzor Singleton.
Jak ukazuje výše uvedený diagram UML, třída singleton má definovanou jedinou instanci a přistupujeme k ní metodou getInstance (). Takže továrna na singleton, která je zodpovědná za vytváření objektů, využívá metodu getInstance k opětovnému vracení stejného objektu (který je ve třídě).
Jak tedy implementujeme Singletonův vzor do programu?
Vytváříme třídu singleton a máme její konstruktor jako „soukromý“, takže třídu nelze vytvořit. Pak vytvoříme soukromou instanci této singletonové třídy uvnitř samotné třídy. Pak máme speciální veřejnou metodu getInstance (), která vrací singletonový objekt do vnějšího světa.
Tato implementace této třídy singleton, jak je vysvětleno výše, je uvedena v programu Java níže.
class SingletonObject { //create an object of SingletonObject private static SingletonObject instance = new SingletonObject(); //private constructor so that we cannot instantiate the class private SingletonObject(){} //returns the only available object public static SingletonObject getInstance(){ return instance; } public void printMessage(){ System.out.println('Hello from Singleton object!!!'); } } public class Main { public static void main(String() args) { //illegal statement because constructor is private //Compile Time Error: The constructor SingletonObject() is not visible //SingletonObject object = new SingletonObject(); //call getInstance to retrieve the object available from the class SingletonObject object = SingletonObject.getInstance(); //show the message object.printMessage(); } }
Výstup:
Nyní, pokud zkontrolujeme hlavní metodu, nezapomeňte, že pokud se pokusíme vytvořit objekt třídy singleton pomocí nového operátoru, kompilátor dá chybu kompilace (viz komentovaný kód v hlavní metodě). Objekt třídy singleton získáme pomocí metody getInstance () a poté jej můžeme použít jako obvykle pro přístup k metodám.
Tovární vzor v Javě
Tovární vzor se v Javě také nazývá „Factory Method pattern“ nebo „Virtual Constructor“. V tomto vzoru vytvoříme rozhraní nebo abstraktní třídu s deklaracemi metod a za vytvoření instancí třídy jsou pak odpovědné konkrétní třídy nebo podtřídy, které implementují toto rozhraní nebo dědí třídu.
Výhody
- Tovární vzor je typ kreačního vzoru a je nejčastěji používaným vzorem v Javě.
- Použitím továrního vzoru zajistíme, aby skutečná logika stvoření nebyla vystavena vnějšímu světu.
Takže pokud má třída implementující vzor továrny metodu pro výpočet úrokové míry, pak konkrétní třídy implementují tuto třídu a také implementují metodu pro výpočet úrokové sazby.
Pak bude existovat další třída, která je tovární třídou, která bude přistupovat k těmto konkrétním instancím tříd, takže si nebudeme vědomi implementace logiky pro výpočet úrokové míry. Zavoláme pouze metodu a získáme výstup.
Kdy přesně tedy můžeme použít vzor Factory Method?
Když se nadřazené třídy rozhodnou delegovat vytváření instancí na své podtřídy, můžeme přejít k továrnímu vzoru (vysvětleno výše). Můžeme také použít tovární metodu, když třída neví, jaké podtřídy mají být vytvořeny.
Nyní se podívejme na implementaci vzoru tovární metody.
Implementace továrního vzoru
Příkladem je implementace obecného tvarového rozhraní. Z tohoto rozhraní můžeme odvodit různé konkrétní třídy, jako je kruh, obdélník atd. Pak budeme mít třídu shapeFactory, která bude přistupovat k objektům konkrétní třídy. Níže je uveden UML pro tento vzor.
Jak již bylo vysvětleno, jedná se o UML diagram pro tovární vzor. Nyní implementujeme program Java, který předvádí tovární vzor.
//Geometric_shape interface interface Geometric_shape { void draw_shape(); } //Geometric shape classes implementing Geometric_shape interface class Rectangle implements Geometric_shape { @Override public void draw_shape() { System.out.println('Rectangle class::draw_shape() method.'); } } class Square implements Geometric_shape { @Override public void draw_shape() { System.out.println('Square class::draw_shape() method.'); } } class Circle implements Geometric_shape { @Override public void draw_shape() { System.out.println('Circle class::draw_shape() method.'); } } //Factory class for Geometric_shape class ShapeFactory { //shapeObject method gets particular shapeType (circle, Square or Rectangle) public Geometric_shape shapeObject(String shapeType){ if(shapeType == null){ return null; } //retrieve Circle object if(shapeType.equalsIgnoreCase('Circle')){ return new Circle(); //retrieve Rectangle object } else if(shapeType.equalsIgnoreCase('Rectangle')){ return new Rectangle(); ////retrieve Square object } else if(shapeType.equalsIgnoreCase('Square')){ return new Square(); } return null; } } public class Main { public static void main(String() args) { //Create a ShapeFactory object to get different geometric shapes ShapeFactory shapeFactory = new ShapeFactory(); //circle Geometric_shape shape_Circle = shapeFactory.shapeObject('CIRCLE'); //draw method of Circle shape_Circle.draw_shape(); //Rectangle Geometric_shape shape_Rectangle = shapeFactory.shapeObject('RECTANGLE'); //draw method of Rectangle shape_Rectangle.draw_shape(); //Square Geometric_shape shape_Square = shapeFactory.shapeObject('SQUARE'); //draw method of square shape_Square.draw_shape(); } }
Výstup:
Tvůrce vzor v Javě
Ve vzoru Builder používáme postupný přístup k sestavení složitého objektu pomocí malých a jednoduchých objektů.
Takže kdykoli narazíme na objekt, který nelze vytvořit v jediném kroku, přejdeme po vzoru stavitele.
Výhody
- Pomocí vzoru Builder můžeme oddělit konstrukci a reprezentaci objektu.
- Můžeme také změnit vnitřní reprezentaci objektu.
- Můžeme vytvářet složité návrhy jako celý doručovací systém pomocí vzoru stavitele.
Praktickým příkladem vzoru Builder je systém objednávání potravin, který zahrnoval složité kroky sběru objednaných potravin, pak balení, fakturace, sestavení objednávky a následná přeprava.
V tomto kurzu implementujeme příklad systému objednávání tabletů pomocí vzoru Builder.
Implementace modelu stavitele
Níže je uveden obecný diagram UML pro vzor Builder.
Výše uvedený diagram ukazuje UML diagram Builder vzoru. Jak je znázorněno ve výše uvedeném diagramu, máme čtyři komponenty ve vzoru Builder.
- Produkt: To představuje složitý objekt, který má být postaven.
- Třída Builder Abstract: Abstraktní třída obsahující prototypy všech funkcí požadovaných k vytvoření komplexního objektu.
- ConcreteBuilder Class: Toto je konkrétní třída, která dědí ze třídy Builder a vytváří konkrétní složitý objekt. Můžeme mít tolik tříd ConcreteBuilder, kolik potřebujeme.
- Třída ředitele: Tato třída řídí algoritmy, které generují konečný produkt.
Následující příklad programování ukazuje demonstraci vzoru Builderu pomocí stavebního systému pro objednávání tabletů.
import java.util.ArrayList; import java.util.List; //Packing interface for tablets interface Packing { public String pack(); public int price(); } //Tablet class - abstract abstract class Tablet implements Packing{ public abstract String pack(); } //company - extends Tablet abstract class Company extends Tablet{ public abstract int price(); } //Lenovo tablet class Lenovo extends Company{ @Override public int price(){ return 541; } @Override public String pack(){ return 'Lenovo Yoga'; } } //Micromax tablet class MicroMax extends Company { @Override public int price(){ return 338; } @Override public String pack(){ return 'MicroMax'; } } //Tablet type class TabType { private List items=new ArrayList(); //add items public void addItem(Packing packs) { items.add(packs); } //retrieve cost public void getCost(){ for (Packing packs : items) { packs.price(); } } //show all items public void showItems(){ for (Packing packing : items){ System.out.print('Tablet name : '+packing.pack()); System.out.println(', Price(in U.S.Dollars) : '+packing.price()); } } } //builder class for tablets order class TabBuilder { public TabType buildLenovoTab(){ TabType lenovo =new TabType(); lenovo.addItem(new Lenovo()); return lenovo; } public TabType buildMicroMaxTab(){ TabType mmx=new TabType(); mmx.addItem(new MicroMax()); return mmx; } } public class Main{ public static void main(String args()){ //build the tablets order and display the order TabBuilder tabBuilder=new TabBuilder(); TabType tabtype1=tabBuilder.buildLenovoTab(); tabtype1.showItems(); TabType tabtype2=tabBuilder.buildMicroMaxTab(); tabtype2.showItems(); } }
Výstup:
Ve výše uvedeném příkladu jsme vytvořili kompletní systém objednávání tabletů pro dvě značky tablet, tj. Lenovo a Micromax. Jedná se o třídy concreteBuilder, které dědí od společnosti abstraktních tříd. Pak máme třídu TabBuilder, která vytváří objednávky pro obě třídy tabletů.
Často kladené otázky
Otázka č. 1) Co jsou návrhové vzory v Javě? Jaké jsou typy návrhových vzorů v Javě?
testování softwaru obnoví vzorky 2 roky zkušeností
Odpovědět: Designérské vzory jsou osvědčené postupy, které lze použít k vývoji osvědčených řešení.
Java má tři typy návrhových vzorů:
- Kreativní návrhový vzor: Tovární vzor, Abstraktní tovární vzor, Singletonův vzor, Tvůrce a prototypový vzor jsou příklady kreačních návrhových vzorů. Jedná se hlavně o vytváření objektů.
- Strukturální návrhový vzor: Většinou se používají k vytvoření struktury třídy. Adaptér, můstek a kompozitní vzor jsou oblíbené vzory konstrukčních návrhů.
- Behaviorální návrhový vzor: Ty poskytují lepší interakci mezi objekty spolu s flexibilitou pro snadné prodloužení implementace. Některé vzorce vzorců chování jsou vzory pozorovatelů, vzorce strategie atd.
Otázka 2) Proč se používají návrhové vzory?
Odpovědět: Návrhové vzory nám poskytují osvědčený a vyzkoušený model řešení, který můžeme použít k řešení složitých problémů. Návrhové vzory nám umožňují vytvářet soudržné moduly s volnou spojkou. Návrhové vzory také zefektivňují a zefektivňují interakci mezi designéry.
Otázka č. 3) Jaké jsou příklady vzorů?
Odpovědět: Příklady přírodních vzorů jsou viditelné zákonitosti vyskytující se v přírodě. Přírodní vzory jako symetrie, stromy, vlny, pěny, pruhy, praskliny atd. Jsou příklady přírodních vzorů.
Otázka č. 4) Je MVC designovým vzorem?
Odpovědět: Ano, je to druh návrhového vzoru, pomocí kterého můžeme vytvořit aplikaci skládající se z datového modelu, prezentace nebo vrstvy zobrazení a řadiče. Můžeme to klasifikovat spíše jako architektonický vzor.
Závěr
Tím je naše diskuse o návrhových vzorech v Javě dokončena. Ačkoli Java podporuje tři typy návrhových vzorů, viz. Kreační, strukturální a behaviorální vzory, více nás zajímá kreační návrhový vzor.
Podle rozsahu tohoto tutoriálu jsme diskutovali tři příklady vzorů kreačních návrhů, jmenovitě singletonový vzor, tovární vzor a vzor stavitele.
Singleton vzor je nejjednodušší návrhový vzor a tovární metoda má být běžným návrhovým vzorem, který je široce používán. Vzor stavitele se používá ke konstrukci složitých objektů a většinou se používá při vývoji složitých aplikací.
=> Podívejte se na průvodce Perfect Java Training Guide zde.
Doporučené čtení
- Výukový program Java String s funkcí String Buffer a String Builder
- Implementace Java: Vytvoření a spuštění souboru Java JAR
- Základy jazyka Java: Syntaxe jazyka Java, třída Java a základní koncepty Java
- Virtuální stroj Java: Jak JVM pomáhá při spouštění aplikace Java
- Výukový program JAVA pro začátečníky: 100+ praktických výukových programů Java Video
- Celé číslo Java a třída Java BigInteger s příklady
- Komponenty Java: Platforma Java, JDK, JRE a Java Virtual Machine
- Seznam důležitých klíčových slov Java - vyhrazená slova v Javě