design patterns java
En aquest tutorial parlarem dels patrons de disseny a Java. Estudiarem els patrons de Singleton, Factory i Builder amb exemples i avantatges:
Quan resolem un problema específic, el podem resoldre de manera més eficient si tenim algunes bones pràctiques ja definides. De fet, això ens ajudarà a seguir aquestes bones pràctiques i a desenvolupar solucions més fiables.
Aquests millors pràctiques que es pot utilitzar per desenvolupar-se solucions ben provades per resoldre problemes s’anomenen “ Patrons de disseny ”. Els desenvolupadors de programari OOP amb experiència utilitzen patrons de disseny per resoldre tasques específiques.
=> Feu una ullada a la guia per a principiants de Java aquí
Què aprendreu:
- Patrons de disseny a Java
- Patró Singleton a Java
- Patró de fàbrica a Java
- Patró del constructor a Java
- Conclusió
Patrons de disseny a Java
Els patrons de disseny van ser inventats per primera vegada per Christopher Alexander el 1977. Però més tard, quatre desenvolupadors, a saber, Erich Gamma, Richard Helm, John Vlissides i Ralph Johnson, van escriure un llibre titulat: Colla de patrons de quatre dissenys, elements de programari reutilitzable orientat a objectes ”L’any 1995.
A partir de llavors, tots els patrons de disseny es van conèixer com ' Colla de quatre patrons de disseny '.
com seleccionar el botó d'opció en selenium webdriver
Els patrons de disseny són independents de qualsevol llenguatge de programació, ja que s’utilitzen per resoldre problemes de disseny comuns orientats a objectes i no es limiten només a un llenguatge de programació específic. Per tant, bàsicament és una idea i no una implementació.
Així, utilitzant patrons de disseny, podem desenvolupar programes que siguin més eficients, flexibles, mantenibles i reutilitzables.
Avantatges dels patrons de disseny
A continuació es detallen alguns dels avantatges d’utilitzar patrons de disseny a les nostres aplicacions:
- Els patrons de disseny es poden reutilitzar i poden ser utilitzats per diversos projectes.
- Podem definir l'arquitectura del sistema mitjançant patrons de disseny.
- Els patrons de disseny proporcionen transparència al disseny de l’aplicació.
- Els patrons de disseny ja estan ben provats i demostrats perquè puguem utilitzar-los sense cap preocupació.
- Els patrons de disseny ens permeten construir millors sistemes i també proporcionen claredat sobre l'arquitectura del sistema.
Quan s’utilitzen patrons de disseny
Llavors, quan hem d’utilitzar exactament els patrons de disseny?
Normalment fem servir un patró de disseny durant la fase inicial d’anàlisi i requisits de SDLC (Software Development Life Cycle). Quan s’utilitza durant l’anàlisi i la fase de requisits de SDLC, proporciona més informació sobre aquesta fase. Java admet internament patrons de disseny.
Els patrons de disseny a Java es classifiquen de la següent manera:
Pel que fa a aquest tutorial, només ens interessen els patrons de disseny creatiu.
Els patrons de disseny creatius es classifiquen de la següent manera:
En aquest tutorial, parlarem dels patrons de disseny següents:
- Patró de disseny Singleton
- Patró de disseny de fàbrica
- Patró de disseny del constructor
Comencem amb un patró de disseny singular a Java.
Lectura recomanada = >> Patrons de disseny per a aplicacions basades en Flask
Patró Singleton a Java
Un patró singleton és un tipus de patró creatiu a Java. El patró Singleton és un patró de disseny en què només hi ha una instància d'una classe a la màquina virtual Java. Una classe de singleton (implementant el patró de singleton) ha de proporcionar un punt d'accés global per obtenir la instància de la classe.
En altres paraules, un patró de singleton restringeix la instanciació d'una classe. El patró Singleton s’utilitza en la implementació del registre per a aplicacions. També s'utilitza en la implementació o la memòria cau de l'agrupació de fils.
Les classes de Java, java.awt.Desktop i java.lang.runtime també utilitzeu un patró singleton.
Avantatges
- Com que només s’utilitza una instància de la classe singleton, estalviem memòria.
- A més, garanteix la reutilització ja que el mateix objecte singleton s'utilitza una i altra vegada.
Ara passem a la implementació del patró de singleton.
Implementació del patró Singleton
Com ja s'ha esmentat, un patró de disseny de singleton restringeix la classe amb només una instància i aquesta instància té un punt d'accés global. Totes aquestes classes feien referència al mateix objecte una i altra vegada.
El següent diagrama UML explica el patró de Singleton.
Com mostra el diagrama UML anterior, una classe singleton té una única instància definida i hi accedim pel mètode getInstance (). Així doncs, una fàbrica de singleton que s’encarrega de crear objectes fa ús del mètode getInstance per tornar el mateix objecte (que hi ha a la classe) una vegada i una altra.
Llavors, com implementem el patró Singleton en un programa?
Creem una classe singleton i tenim el seu constructor com a 'privat' perquè la classe no es pugui instanciar. A continuació, creem una instància privada d’aquesta classe de singleton dins de la mateixa classe. Després tenim un mètode públic especial getInstance () que retorna un objecte singleton al món exterior.
Aquesta implementació d'aquesta classe de singleton, tal com s'ha explicat anteriorment, es mostra al programa Java següent.
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(); } }
Sortida:
Ara, si comprovem el mètode principal, tingueu en compte que si intentem crear un objecte de la classe singleton mitjançant un nou operador, el compilador donarà un error de compilació (vegeu el codi comentat al mètode principal). Obtenim l'objecte de la classe singleton mitjançant el mètode getInstance () i després el podem utilitzar com sempre per accedir als mètodes.
Patró de fàbrica a Java
El patró de fàbrica també es diu 'Patró de mètode de fàbrica' o 'Constructor virtual' a Java. En aquest patró, creem una interfície o una classe abstracta amb declaracions de mètodes i, a continuació, les classes o subclasses concretes que implementen aquesta interfície o que hereten la classe són les responsables de crear instàncies de la classe.
Avantatges
- El patró de fàbrica és un tipus de patró de creació i és el patró més utilitzat a Java.
- Mitjançant l’ús d’un patró de fàbrica ens assegurem que la lògica de creació real no s’exposa al món exterior.
Per tant, si una classe que implementa un patró de fàbrica té un mètode per calcular la taxa d’interès, les classes concretes implementaran aquesta classe i també implementaran el mètode per calcular la taxa d’interès.
Després hi haurà una altra classe que és una classe de fàbrica que accedirà a aquestes instàncies concretes de classe de manera que no siguem conscients de com s’implementa la lògica per calcular el tipus d’interès. Només cridem al mètode i obtenim la sortida.
Llavors, quan podem utilitzar exactament el patró Factory Method?
Quan les classes pares decideixen delegar la creació d’instàncies a les seves subclasses, podem optar per un patró de fàbrica (Això s’explica més amunt). També podem utilitzar el mètode de fàbrica quan la classe no sap quines subclasses s’han de crear.
Ara vegem la implementació del patró de mètode de fàbrica.
Implementació del patró de fàbrica
Com a exemple, implementem una interfície de forma genèrica. Podem derivar diverses classes concretes d’aquesta interfície com el cercle, rectangle, etc. Després tindrem una classe shapeFactory que accedirà als objectes de la classe concreta. A continuació es mostra l’UML d’aquest patró.
Com ja s'ha explicat, aquest és el diagrama UML per al patró de fàbrica. Ara implementarem un programa Java que demostri el patró de fàbrica.
//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(); } }
Sortida:
Patró del constructor a Java
Al patró Builder, fem servir un enfocament pas a pas per construir un objecte complex mitjançant objectes simples i petits.
Per tant, cada vegada que trobem un objecte que no es pot crear en un sol pas, anem per un patró de generador.
Avantatges
- Mitjançant el patró Builder, podem separar la construcció i la representació d’un objecte.
- També podem canviar la representació interna de l'objecte.
- Podem construir dissenys complexos, com tot un sistema de lliurament, mitjançant el patró constructor.
Un exemple pràctic d’un patró de constructor és el sistema de comanda d’aliments que implicava passos complexos de recollida d’aliments que es demanen, després envasats, facturats, construïts i enviats.
En aquest tutorial, implementarem un exemple d'un sistema de comandes de tauletes mitjançant el patró Builder.
Implementació del patró del constructor
A continuació es mostra el diagrama UML general per al patró Builder.
El diagrama anterior mostra el diagrama UML del patró Builder. Com es mostra al diagrama anterior, tenim quatre components en el patró Builder.
- Producte: Això representa l'objecte complex a construir.
- Classe de Resum del constructor: Una classe abstracta que conté prototips de totes les funcionalitats necessàries per construir un objecte complex.
- Classe ConcreteBuilder: Aquesta és una classe concreta que hereta de la classe Builder i crea un objecte complex particular. Podem tenir tantes classes de ConcreteBuilder com necessitem.
- Classe de director: Aquesta classe controla els algoritmes que generen el producte final.
L'exemple de programació següent mostra la demostració d'un patró Builder mitjançant un sistema de construcció de comandes de tauletes.
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(); } }
Sortida:
A l'exemple anterior, hem creat el sistema complet de comanda de tauletes per a dues marques de tauletes, és a dir, Lenovo i Micromax. Aquestes són les classes concreteBuilder que hereten de l'empresa de classes abstractes. A continuació, tenim una classe TabBuilder que crea les ordres de les dues classes de tauletes.
Preguntes freqüents
P # 1) Què són els patrons de disseny a Java? Quins són els tipus de patrons de disseny a Java?
Preguntes i respostes de l'entrevista del servidor sq ms
Resposta: Els patrons de disseny són les millors pràctiques que es poden utilitzar per desenvolupar solucions ben provades.
Java té tres tipus de patrons de disseny:
- Patró de disseny creatiu: Patró de fàbrica, patró de fàbrica abstracta, patró de Singleton, patró de constructor i patró de prototipus són exemples de patrons de disseny creatiu. Es tracta principalment de la creació d'objectes.
- Patró de disseny estructural: S’utilitzen principalment per crear una estructura de classes. L’adaptador, el pont i el patró compost són patrons de disseny estructural populars.
- Patró de disseny conductual: Aquests proporcionen una millor interacció entre els objectes juntament amb la flexibilitat per ampliar fàcilment la implementació. Patrons d’observadors, patrons d’estratègia, etc. són alguns exemples dels patrons de comportament.
P # 2) Per què s’utilitzen els patrons de disseny?
Resposta: Els patrons de disseny ens proporcionen un model de solució provat i provat que podem utilitzar per resoldre problemes complexos. Els patrons de disseny ens permeten construir mòduls cohesius amb un acoblament fluix. Els patrons de disseny també fan que la interacció entre dissenyadors sigui més eficaç i eficaç.
P # 3) Quins són els exemples de patrons?
Resposta: Exemples de patrons naturals són les regularitats visibles que es troben a la natura. Patrons naturals com simetries, arbres, ones, escumes, ratlles, esquerdes, etc. són alguns exemples de patrons naturals.
Q # 4) El MVC és un patró de disseny?
Resposta: Sí, és un tipus de patró de disseny mitjançant el qual podem construir una aplicació que consisteix en el model de dades, la presentació o la capa de visualització i el controlador. El podem classificar més com a patró arquitectònic.
Conclusió
Això completa la nostra discussió sobre els patrons de disseny a Java. Tot i que Java admet tres tipus de patrons de disseny, a saber. Els patrons creatius, estructurals i conductuals ens interessen més pel patró de disseny creatiu.
Segons l’abast d’aquest tutorial, hem parlat de tres exemples de patrons de disseny creatiu, a saber, el patró singleton, el patró de fàbrica i el patró de constructor.
El patró Singleton és el patró de disseny més simple i se suposa que el mètode de fàbrica és un patró de disseny comú que s’utilitza àmpliament. El patró constructor s’utilitza per construir objectes complexos i s’utilitza sobretot en el desenvolupament d’aplicacions complexes.
=> Consulteu la guia de formació Java perfecta aquí.
Lectura recomanada
- Java String amb buffer de cadenes i tutorial de Generador de cadenes
- Desplegament de Java: creació i execució del fitxer JAR de Java
- Conceptes bàsics de Java: sintaxi de Java, Java Class i conceptes bàsics de Java
- Màquina virtual Java: com ajuda JVM a executar aplicacions Java
- Tutorial JAVA per a principiants: més de 100 tutorials pràctics de vídeo Java
- Java Integer i Java BigInteger Class amb exemples
- Components de Java: plataforma Java, JDK, JRE i màquina virtual de Java
- Llista de paraules clau Java importants: paraules reservades a Java