design patterns java
W tym samouczku omówimy wzorce projektowe w Javie. Przeanalizujemy wzorce Singleton, Factory i Builder z przykładami i zaletami:
Kiedy rozwiązujemy konkretny problem, możemy go rozwiązać bardziej efektywnie, jeśli mamy już zdefiniowane najlepsze praktyki. To rzeczywiście pomoże nam postępować zgodnie z tymi najlepszymi praktykami i opracowywać bardziej niezawodne rozwiązania.
Te najlepsze praktyki które można wykorzystać do rozwoju sprawdzone rozwiązania do rozwiązywania problemów nazywane są „ Wzorce projektowe ”. Doświadczeni programiści OOP wykorzystują wzorce projektowe do rozwiązywania określonych zadań.
=> Zapoznaj się z podręcznikiem Java dla początkujących tutaj
Czego się nauczysz:
- Wzorce projektowe w Javie
- Singleton Pattern w Javie
- Wzorzec fabryczny w Javie
- Wzorzec konstruktora w Javie
- Wniosek
Wzorce projektowe w Javie
Wzorce projektowe zostały po raz pierwszy wynalezione przez Christophera Alexandra w 1977 roku. Jednak później czterech programistów, mianowicie Erich Gamma, Richard Helm, John Vlissides i Ralph Johnson, napisali książkę zatytułowaną „ Gang of Four-Design, elementy oprogramowania obiektowego wielokrotnego użytku ”W roku 1995.
Od tego czasu wszystkie wzorce projektowe stały się znane jako „ Gang of Four Design Patterns ”.
najlepsze oprogramowanie do odzyskiwania zewnętrznego dysku twardego
Wzorce projektowe są niezależne od języków programowania, ponieważ są używane do rozwiązywania typowych problemów projektowych zorientowanych obiektowo i nie są ograniczone tylko do określonego języka programowania. Zasadniczo jest to pomysł, a nie realizacja.
W ten sposób wykorzystując wzorce projektowe możemy tworzyć programy, które są bardziej wydajne, elastyczne, łatwe w utrzymaniu i wielokrotnego użytku.
Zalety wzorców projektowych
Poniżej wymieniono niektóre zalety stosowania wzorców projektowych w naszych aplikacjach:
- Wzorce projektowe są wielokrotnego użytku i mogą być używane w wielu projektach.
- Możemy zdefiniować architekturę systemu za pomocą wzorców projektowych.
- Wzorce projektowe zapewniają przejrzystość projektu aplikacji.
- Wzory projektowe są już dobrze przetestowane i sprawdzone, dzięki czemu możemy z nich korzystać bez obaw.
- Wzorce projektowe pozwalają nam budować lepsze systemy, a także zapewniają przejrzystość architektury systemu.
Kiedy używać wzorców projektowych
Kiedy więc dokładnie powinniśmy używać wzorców projektowych?
Zwykle używamy wzorca projektowego podczas początkowej fazy analizy i wymagań SDLC (cyklu życia oprogramowania). W przypadku użycia podczas fazy analizy i wymagań SDLC dostarcza więcej informacji na ten temat. Java wewnętrznie obsługuje wzorce projektowe.
Wzorce projektowe w Javie są podzielone na następujące kategorie:
Jeśli chodzi o ten samouczek, interesują nas tylko kreacyjne wzorce projektowe.
Kreacyjne wzorce projektowe są dalej klasyfikowane w następujący sposób:
W tym samouczku omówimy następujące wzorce projektowe:
- Wzorzec projektowy singleton
- Wzorzec projektowy fabryki
- Wzorzec projektowy konstruktora
Zacznijmy od pojedynczego wzorca projektowego w Javie.
Zalecana literatura = >> Wzorce projektowe dla aplikacji opartych na Flask
Singleton Pattern w Javie
Wzorzec singleton to typ wzorca kreacji w Javie. Wzorzec singleton to wzorzec projektowy, w którym tylko jedno wystąpienie klasy jest obecne w maszynie wirtualnej Java. Klasa pojedyncza (implementująca wzorzec singleton) musi zapewniać globalny punkt dostępu, aby uzyskać wystąpienie klasy.
Innymi słowy, wzorzec singletona ogranicza tworzenie instancji klasy. Wzorzec singleton jest używany w implementacji rejestratora dla aplikacji. Jest również używany w implementacji puli wątków lub pamięci podręcznej.
Klasy Java, java.awt.Desktop i java.lang.runtime użyj również wzorca singleton.
Zalety
- Ponieważ używana jest tylko jedna instancja klasy singleton, oszczędzamy pamięć.
- Zapewnia również możliwość ponownego użycia, ponieważ ten sam obiekt singleton jest używany wielokrotnie.
Teraz przejdźmy do implementacji wzorca singleton.
Implementacja wzorca Singleton
Jak już wspomniano, pojedynczy wzorzec projektowy ogranicza klasę tylko do jednego wystąpienia, a to wystąpienie otrzymuje globalny punkt dostępu. To były wszystkie klasy, które wielokrotnie odwoływały się do tego samego obiektu.
Poniższy diagram UML wyjaśnia wzorzec Singleton.
Jak widać na powyższym diagramie UML, klasa pojedyncza ma zdefiniowaną jedną instancję, do której uzyskujemy dostęp za pomocą metody getInstance (). Tak więc pojedyncza fabryka, która jest odpowiedzialna za tworzenie obiektów, używa metody getInstance do zwracania tego samego obiektu (który znajduje się w klasie) w kółko.
Jak więc zaimplementować wzorzec singletona w programie?
Tworzymy klasę pojedynczą i mamy jej konstruktor jako „prywatny”, aby nie można było utworzyć instancji tej klasy. Następnie tworzymy prywatną instancję tej klasy singleton wewnątrz samej klasy. Następnie mamy specjalną metodę publiczną getInstance (), która zwraca pojedynczy obiekt do świata zewnętrznego.
Ta implementacja tej klasy pojedynczej, jak wyjaśniono powyżej, jest pokazana w poniższym programie Java.
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(); } }
Wynik:
Teraz, jeśli sprawdzimy metodę main, zauważmy, że jeśli spróbujemy utworzyć obiekt klasy singleton przy użyciu nowego operatora, kompilator poda błąd kompilacji (patrz skomentowany kod w metodzie main). Otrzymujemy obiekt klasy singleton za pomocą metody getInstance (), a następnie możemy go jak zwykle używać do uzyskiwania dostępu do metod.
Wzorzec fabryczny w Javie
Wzorzec fabryki jest również nazywany w języku Java „wzorcem metody fabrycznej” lub „wirtualnym konstruktorem”. W tym wzorcu tworzymy interfejs lub klasę abstrakcyjną z deklaracjami metod, a następnie konkretne klasy lub podklasy implementujące ten interfejs lub dziedziczące klasę są odpowiedzialne za tworzenie instancji klasy.
Zalety
- Wzorzec fabryki jest typem wzorca kreacyjnego i jest najczęściej używanym wzorcem w Javie.
- Używając wzorca fabryki, zapewniamy, że rzeczywista logika tworzenia nie jest ujawniona światu zewnętrznemu.
Jeśli więc klasa implementująca wzorzec fabryki ma metodę obliczania stopy procentowej, to konkretne klasy będą implementowały tę klasę, a także implementowały metodę obliczania stopy procentowej.
Następnie pojawi się inna klasa, która jest klasą fabryczną, która będzie miała dostęp do tych konkretnych instancji klas, abyśmy nie byli świadomi, w jaki sposób jest zaimplementowana logika obliczania stopy procentowej. Wywołujemy tylko metodę i otrzymujemy wynik.
Kiedy więc dokładnie możemy użyć wzorca Factory Method?
Kiedy klasy nadrzędne zdecydują się delegować tworzenie instancji do swoich podklas, możemy przejść do wzorca fabrycznego (wyjaśniono to powyżej). Możemy również użyć metody fabrycznej, gdy klasa nie wie, jakie podklasy mają zostać utworzone.
Zobaczmy teraz implementację wzorca metody fabryki.
Wdrożenie wzorca fabrycznego
Jako przykład zaimplementujmy ogólny interfejs kształtu. Z tego interfejsu możemy wyprowadzić różne konkretne klasy, takie jak okrąg, prostokąt itp. Następnie będziemy mieli klasę shapeFactory, która będzie miała dostęp do konkretnych obiektów klas. Poniżej przedstawiono UML dla tego wzorca.
Jak już wyjaśniono, jest to diagram UML dla wzorca fabrycznego. Teraz zaimplementujemy program w Javie demonstrujący wzorzec fabryki.
//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(); } }
Wynik:
Wzorzec konstruktora w Javie
We wzorcu Builder używamy podejścia krok po kroku, aby zbudować złożony obiekt przy użyciu małych i prostych obiektów.
Dlatego zawsze, gdy napotykamy obiekt, którego nie można utworzyć w jednym kroku, wybieramy wzorzec konstruktora.
Zalety
- Korzystając ze wzorca Builder, możemy oddzielić konstrukcję i reprezentację obiektu.
- Możemy również zmienić wewnętrzną reprezentację obiektu.
- Możemy budować złożone projekty, takie jak cały system dostarczania, używając wzorca konstruktora.
Praktycznym przykładem wzorca Konstruktora jest system zamawiania jedzenia, który obejmował skomplikowane etapy zbierania zamówionych produktów spożywczych, następnie pakowania, wystawiania faktur, składania zamówienia, a następnie wysyłania.
W tym samouczku zaimplementujemy przykład systemu zamawiania tabletów przy użyciu wzorca Builder.
Implementacja wzorca Builder
Ogólny diagram UML dla wzorca Builder jest podany poniżej.
Powyższy diagram przedstawia diagram UML wzorca Konstruktora. Jak pokazano na powyższym diagramie, we wzorcu Builder mamy cztery komponenty.
- Produkt: Reprezentuje złożony obiekt do zbudowania.
- Klasa Builder Abstract: Klasa abstrakcyjna zawierająca prototypy wszystkich funkcji wymaganych do zbudowania złożonego obiektu.
- Klasa ConcreteBuilder: Jest to konkretna klasa, która dziedziczy po klasie Builder i tworzy określony złożony obiekt. Możemy mieć tyle klas ConcreteBuilder, ile potrzebujemy.
- Klasa reżysera: Ta klasa kontroluje algorytmy generujące produkt końcowy.
Poniższy przykład programowania przedstawia demonstrację wzorca Builder przy użyciu systemu zamawiania tabletów.
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(); } }
Wynik:
W powyższym przykładzie zbudowaliśmy kompletny system zamawiania tabletów dla dwóch marek tabletów tj. Lenovo i Micromax. To są klasy concreteBuilder, które dziedziczą po firmie klasy abstrakcyjnej. Następnie mamy klasę TabBuilder, która buduje zamówienia dla obu klas tabletów.
Często Zadawane Pytania
Pytanie 1) Co to są wzorce projektowe w Javie? Jakie są typy wzorców projektowych w Javie?
jakiego narzędzia możesz użyć do wizualnej reprezentacji i analizy bazy danych?
Odpowiedź: Wzorce projektowe to najlepsze praktyki, które można wykorzystać do opracowania dobrze przetestowanych rozwiązań.
Java ma trzy typy wzorców projektowych:
- Kreacyjny wzorzec projektowy: Wzorzec fabryczny, wzorzec abstrakcyjnej fabryki, wzorzec singleton, wzorzec Konstruktora i wzorzec prototypu to przykłady kreacyjnych wzorców projektowych. Są to głównie związane z tworzeniem obiektów.
- Wzorzec konstrukcyjny: Są najczęściej używane do tworzenia struktury klas. Adapter, mostek i wzór kompozytowy to popularne wzorce projektowania strukturalnego.
- Wzorzec projektowania behawioralnego: Zapewniają one lepszą interakcję między obiektami, a także elastyczność umożliwiającą łatwe rozszerzanie implementacji. Wzorce obserwatorów, wzorzec strategii itp. To tylko niektóre przykłady wzorców zachowań.
P # 2) Dlaczego używa się wzorców projektowych?
Odpowiedź: Wzorce projektowe zapewniają nam sprawdzony i przetestowany model rozwiązania, który możemy wykorzystać do rozwiązywania złożonych problemów. Wzorce projektowe pozwalają nam budować spójne moduły z luźnym sprzężeniem. Wzorce projektowe sprawiają również, że interakcje między projektantami są bardziej wydajne i efektywne.
P # 3) Jakie są przykłady wzorców?
Odpowiedź: Przykładami naturalnych wzorców są widoczne prawidłowości występujące w przyrodzie. Naturalne wzory, takie jak symetrie, drzewa, fale, pianki, paski, pęknięcia itp. To tylko niektóre przykłady naturalnych wzorów.
Pytanie 4) Czy MVC to wzorzec projektowy?
Odpowiedź: Tak, jest to rodzaj wzorca projektowego, za pomocą którego możemy zbudować aplikację składającą się z modelu danych, warstwy prezentacji lub widoku i kontrolera. Możemy to bardziej sklasyfikować jako wzorzec architektoniczny.
Wniosek
To kończy naszą dyskusję na temat wzorców projektowych w Javie. Chociaż Java obsługuje trzy typy wzorców projektowych, a mianowicie. Wzorce kreacyjne, strukturalne i behawioralne, bardziej interesuje nas kreacyjny wzorzec projektowy.
Zgodnie z zakresem tego samouczka omówiliśmy trzy przykłady kreacyjnych wzorców projektowych, a mianowicie wzorzec singleton, wzorzec fabryczny i wzorzec konstruktora.
Wzorzec singleton to najprostszy wzorzec projektowy, a metoda fabryczna ma być powszechnie stosowanym wzorcem projektowym. Wzorzec konstruktora jest używany do konstruowania złożonych obiektów i jest używany głównie do tworzenia złożonych aplikacji.
=> Sprawdź idealny przewodnik szkoleniowy języka Java tutaj.
rekomendowane lektury
- Ciąg Java z buforem ciągów i samouczek dotyczący tworzenia ciągów
- Wdrażanie Java: tworzenie i wykonywanie pliku Java JAR
- Podstawy języka Java: składnia języka Java, klasa języka Java i podstawowe pojęcia dotyczące języka Java
- Wirtualna maszyna Java: jak JVM pomaga w uruchamianiu aplikacji Java
- Samouczek JAVA dla początkujących: ponad 100 praktycznych samouczków wideo Java
- Klasa Java Integer i Java BigInteger z przykładami
- Komponenty Java: platforma Java, JDK, JRE i wirtualna maszyna Java
- Lista ważnych słów kluczowych w języku Java - słowa zastrzeżone w języku Java