Uvod u kreativne uzorke dizajna

1. Uvod

U softverskom inženjerstvu, Uzorak dizajna opisuje utvrđeno rješenje za najčešće probleme u dizajniranju softvera. Predstavlja najbolje prakse koje su iskusni programeri softvera razvijali tijekom dugog razdoblja.

Uzorci dizajna stekli su popularnost nakon što su 1994. godine knjigu Error Gamma, John Vlissides, Ralph Johnson i Richard Helm (poznatiji kao Gang of Four ili GoF) objavili knjigu Design Patterns: Elements of Reusable Object-Oriented Software.

U ovom ćemo članku istražiti kreativne uzorke dizajna i njihove vrste. Također ćemo pogledati neke uzorke koda i razgovarati o situacijama kada ti uzorci odgovaraju našem dizajnu.

2. Kreativni uzorci dizajna

Uzorci kreativnog dizajna bave se načinom na koji se stvaraju objekti. Smanjuju složenost i nestabilnost stvaranjem objekata na kontroliran način.

The novi Operator se često smatra štetnim jer razbacuje predmete po cijeloj aplikaciji. Vremenom promjena implementacije može postati izazov jer su klase usko povezane.

Uzorci kreativnog dizajna rješavaju ovaj problem odvajanjem klijenta u potpunosti od stvarnog postupka inicijalizacije.

U ovom ćemo članku razgovarati o četiri vrste uzorka kreativnog dizajna:

  1. Singleton - osigurava da tijekom aplikacije postoji najviše samo jedan primjerak objekta
  2. Tvornička metoda - stvara objekte nekoliko povezanih klasa bez navođenja točnog objekta koji će se stvoriti
  3. Abstract Factory - Stvara obitelji povezanih ovisnih objekata
  4. GraditeljKonstruira složene objekte postupnim pristupom

Razmotrimo sada detaljno svaki od ovih obrazaca.

3. Jednokračni uzorak dizajna

Uzorak dizajna Singleton želi zadržati provjeru inicijalizacije objekata određene klase od strane osiguravajući da samo jedan primjerak objekta postoji u cijelom Java virtualnom stroju.

Klasa Singleton također pruža jednu jedinstvenu globalnu pristupnu točku objektu tako da svaki sljedeći poziv pristupnoj točki vraća samo taj određeni objekt.

3.1. Primjer pojedinačnog uzorka

Iako je GoFon uveo Singleton obrazac, poznato je da je izvorna implementacija problematična u višenitnim scenarijima.

Dakle, ovdje ćemo slijediti optimalniji pristup koji koristi statičku unutarnju klasu:

javna klasa Singleton {private Singleton () {} private static class SingletonHolder {public static final Singleton instance = new Singleton (); } javni statički Singleton getInstance () {return SingletonHolder.instance; }}

Evo, stvorili smo statički unutarnja klasa koja drži instancu Singleton razred. Stvara instancu samo kad netko pozove getInstance () metoda, a ne kada je učitana vanjska klasa.

Ovo je široko korišten pristup za Singleton klasu jer ne zahtijeva sinkronizaciju, siguran je u nitima, provodi lijenu inicijalizaciju i ima relativno manje uzorka.

Također, imajte na umu da konstruktor ima privatni modifikator pristupa. To je uvjet za stvaranje Singletona od javnost konstruktor značilo bi da mu bilo tko može pristupiti i početi stvarati nove instance.

Zapamtite, ovo nije izvorna implementacija GoF-a. Za izvornu verziju posjetite ovaj povezani Baeldung članak o Singletonima u Javi.

3.2. Kada koristiti jednobojni obrazac dizajna

  • Za resurse koje je skupo stvoriti (poput objekata veze s bazom podataka)
  • Dobra je praksa da sve drvosječe držite kao jednokrevetne, što povećava performanse
  • Klase koje omogućuju pristup postavkama konfiguracije za aplikaciju
  • Klase koje sadrže resurse kojima se pristupa u dijeljenom načinu

4. Obrazac dizajna tvorničke metode

Obrazac tvorničkog dizajna ili obrazac dizajna tvorničke metode jedan je od najčešće korištenih dizajnerskih obrazaca u Javi.

Prema GoF-u, ovaj obrazac “Definira sučelje za stvaranje objekta, ali neka potklase odluče koju će klasu instancirati. Tvornička metoda omogućuje klasi odgađanje instanciranja za podrazrede ”.

Ovaj obrazac delegira odgovornost inicijalizacije klase s klijenta na određenu tvorničku klasu stvaranjem vrste virtualnog konstruktora.

Da bismo to postigli, oslanjamo se na tvornicu koja nam pruža objekte, skrivajući stvarne detalje implementacije. Stvorenim objektima se pristupa zajedničkim sučeljem.

4.1. Primjer uzorka dizajna tvorničke metode

U ovom primjeru stvorit ćemo Poligon sučelje koje će provoditi nekoliko konkretnih klasa. A PoligonTvornica koristit će se za dohvaćanje predmeta iz ove obitelji:

Idemo prvo stvoriti Poligon sučelje:

javno sučelje Poligon {String getType (); }

Dalje ćemo stvoriti nekoliko implementacija poput Kvadrat, Trokut, itd. koji implementiraju ovo sučelje i vraćaju objekt od Poligon tip.

Sada možemo stvoriti tvornicu koja uzima broj strana kao argument i vraća odgovarajuću implementaciju ovog sučelja:

javna klasa PolygonFactory {javni poligon getPolygon (int numberOfSides) {if (numberOfSides == 3) {return new Triangle (); } if (numberOfSides == 4) {return new Square (); } if (numberOfSides == 5) {return new Pentagon (); } if (numberOfSides == 7) {return new Heptagon (); } else if (numberOfSides == 8) {return new Octagon (); } return null; }}

Primijetite kako se klijent može osloniti na ovu tvornicu kako bi nam dao odgovarajuću Poligon, bez potrebe za direktnom inicijalizacijom objekta.

4.2. Kada koristiti obrazac dizajna tvorničke metode

  • Kada se očekuje da će se implementacija sučelja ili apstraktne klase često mijenjati
  • Kada se trenutna provedba ne može udobno prilagoditi novim promjenama
  • Kada je postupak inicijalizacije relativno jednostavan, a konstruktor zahtijeva samo nekoliko parametara

5. Apstraktni obrazac dizajna tvornice

U prethodnom smo odjeljku vidjeli kako se obrazac dizajna tvorničke metode može koristiti za stvaranje predmeta povezanih s jednom obitelji.

Suprotno tome, Uzorak dizajna sažetih tvornica koristi se za stvaranje obitelji srodnih ili ovisnih objekata. Ponekad se naziva i tvornicom tvornica.

Za detaljno objašnjenje pogledajte naš vodič za Factory Factory.

6. Uzorak dizajnera graditelja

Uzorak dizajnera graditelja još je jedan kreativni obrazac dizajniran za bavljenje konstrukcijom relativno složenih objekata.

Kada se složenost izrade objekta poveća, uzorak Graditelja može odvojiti postupak instancije korištenjem drugog objekta (graditelja) za izgradnju objekta.

Tada se ovaj graditelj može koristiti za stvaranje mnogih drugih sličnih prikaza koristeći jednostavan korak-po-korak pristup.

6.1. Primjer uzoraka graditelja

Izvorni uzorak dizajnera graditelja koji je predstavio GoF usredotočio se na apstrakciju i vrlo je dobar kada se radi sa složenim objektima, međutim, dizajn je malo kompliciran.

Joshua Bloch je u svojoj knjizi Effective Java predstavio poboljšanu verziju uzoraka graditelja koja je čista, vrlo čitljiva (jer koristi tečan dizajn) i jednostavna za upotrebu iz perspektive klijenta. U ovom ćemo primjeru razgovarati o toj verziji.

Ovaj primjer ima samo jednu klasu, Bankovni račun koji sadrži graditelja kao a statički unutarnja klasa:

public class BankAccount {naziv privatnog niza; private String accountNumber; privatni String e-mail; privatni booleovski bilten; // konstruktori / getteri javna statička klasa BankAccountBuilder {// graditeljski kod}} 

Imajte na umu da su svi modifikatori pristupa na poljima deklarirani privatni budući da ne želimo da im vanjski objekti izravno pristupaju.

Konstruktor je također privatni tako da joj može pristupiti samo Graditelj dodijeljen ovoj klasi. Sva svojstva postavljena u konstruktoru izdvojena su iz objekta graditelja koji dostavljamo kao argument.

Mi smo definirali BankAccountBuilder u statički unutarnja klasa:

javna statička klasa BankAccountBuilder {naziv privatnog niza; private String accountNumber; privatni String e-mail; privatni booleovski bilten; public BankAccountBuilder (Ime niza, Niz broja računa) {this.name = name; this.accountNumber = broj računa; } javni BankAccountBuilder withEmail (niz e-pošte) {this.email = email; vrati ovo; } javni BankAccountBuilder wantNewsletter (logički bilten) {this.newsletter = bilten; vrati ovo; } javni BankAccount build () {return new BankAccount (this); }} 

Primijetite da smo proglasili isti skup polja koji sadrži vanjska klasa. Sva obavezna polja potrebna su kao argumenti konstruktora unutarnje klase, dok se preostala neobavezna polja mogu specificirati pomoću metoda postavljača.

Ova implementacija također podržava fluidan pristup dizajnu tako što metode postavljača vraćaju objekt graditelja.

Napokon, metoda gradnje poziva privatni konstruktor vanjske klase i predaje se kao argument. Povratak Bankovni račun bit će instanciran s parametrima koje postavlja BankAccountBuilder.

Pogledajmo kratki primjer uzoraka graditelja na djelu:

BankAccount newAccount = novi BankAccount .BankAccountBuilder ("Jon", "22738022275") .withEmail ("[email protected]") .wantNewsletter (true) .build ();

6.2. Kada koristiti uzorak graditelja

  1. Kada je postupak koji je uključen u stvaranje objekta izuzetno složen, s puno obveznih i neobaveznih parametara
  2. Kada povećanje broja parametara konstruktora dovede do velikog popisa konstruktora
  3. Kada klijent očekuje različite predstave za objekt koji je izgrađen

7. Zaključak

U ovom smo članku saznali o kreativnim uzorcima dizajna u Javi. Također smo razgovarali o njihove četiri različite vrste, tj. Singleton, Factory Method, Abstract Factory i Builder Pattern, njihovim prednostima, primjerima i kada ih trebamo koristiti.

Kao i uvijek, cjeloviti isječci koda dostupni su na GitHubu.