V tomto článku si jednoducho vysvetlíme najpoužívanejšie návrhové vzory v jave. Ak ťa baví video forma, tak pod každou sekciou budeš mať možnosť pozrieť si aj video. Poďme na to a pustime sa do spolu do článku najpoužívanejšie návrhové vzory v jave.
Singleton
Singleton znamená, že ak spravíš instanciu nejakej triedy, tak už nedokážeš spraviť viac takýchto instancií. Teda existuje vždy len jedna instancia.
public class SingletonExample {
private static SingletonExample instance = null;
private SingletonExample () {
}
public static SingletonExample getInstance() {
if(instance == null) {
instance = new SingletonExample ();
}
return instance;
}
}
Ak napíšeš privátny konštruktor bezparametrický, tak si zaručil, že nikto mimo triedy SingletonExample nedokáže spraviť instanciu tejto triedy. Ak chceš získať instanciu tejto triedy, tak zavoláš metódu getInstance, ktorá zaručí, že ak existuje už instancia, tak ti vráti presne tú jednu instanciu a ak ešte neexistuje, tak ju vytvorí.
Pre overenie si spusti takúto metódu:
private static void singleton() {
SingletonExample singletonExample = SingletonExample.getInstance();
SingletonExample singletonExample2 = SingletonExample.getInstance();
if(singletonExample.equals(singletonExample2)){
System.out.println("objektu sa rovnajú");
}
}
Factory
S faktory patternom si sa mohol stretnúť pri JPA, kde sme získavali EntityManager z EntityManagerFactory. Čo sa vlastne stalo? V našom programe sme potrebovali instanciu EntityManageru, ktorú sme ale nedokázali spraviť samy. Zavolali sme teda Factory – továreň – ktorá nám túto instanciu vyrobila a dodala. Pozrime sa na jednoduchý príklad.
Kladivo kladivo = Factory.createKladivo();
public class Factory {
public static Kladivo createKladivo(){
Kladivo kladivo = new Kladivo();
//seters alebo iná manipulácia s kladivom
return kladivo;
}
}
Builder
Ak má nejaká trieda veľa parametrov, ktoré treba naplniť, tak by kód nevyzeral až tak pekne, keby sme museli volať napríklad 20 setterov. Čo môžeš spraviť je zakomponovať v rámci triedy Builder objekt, ktorý nasetuje tieto parametre namiesto teba. Ty napríklad zavoláš metódu id ale na pozadí ti builder spraví setId a vráti instanciu objektu. Vybudovanie takéhoto objektu sa dá potom pospájať cez bodky a kód vyzerá oveľa krajšie.
Predstav si takýto kód, ktorý vyzerá prehľadne:
private static void builder() {
Kladivo kladivo = Kladivo.noveKladivo()
.farba("Biele")
.vyrobca("OBI")
.dlzka(40.50f)
.build();
}
Za ním sa ale skrýva ukrytá trieda Builder. Metóda noveKladivo vracia instanciu práve tohto Builderu. Nad týmto builderom sa potom volajú metódy ako farba alebo vyrobca. Nakoniec zavoláme metódu build, ktorá z tohto builderu znovu spraví Kladivo.
public class Kladivo {
String farba;
String vyrobca;
float dlzka;
//...
public Kladivo(Builder builder) {
setFarba(builder.farba);
setVyrobca(builder.vyrobca);
setDlzka(builder.dlzka);
}
public static Builder noveKladivo() {
return new Builder();
}
public String getFarba() {
return farba;
}
public void setFarba(String farba) {
this.farba = farba;
}
public String getVyrobca() {
return vyrobca;
}
public void setVyrobca(String vyrobca) {
this.vyrobca = vyrobca;
}
public float getDlzka() {
return dlzka;
}
public void setDlzka(float dlzka) {
this.dlzka = dlzka;
}
public static class Builder{
private String farba;
private String vyrobca;
private float dlzka;
//...
private Builder(){
}
public Builder farba(String farba){
this.farba = farba;
return this;
}
public Builder vyrobca(String vyrobca){
this.vyrobca = vyrobca;
return this;
}
public Builder dlzka(float dlzka){
this.dlzka = dlzka;
return this;
}
public Kladivo build(){
return new Kladivo(this);
}
}
}
Observer Pattern
Oberver pattern použiješ, ak chceš oznámiť svoj stav okoliu, teda tým, čo ťa pozorujú. Máš na sebe zaregistrovaných niekoľko pozorovateľov a ak sa tvoj stav zmení, tak ich vieš informovať.
Uvažujme, že napíšem novú novinku. Noviny a Blog o tom chcú vedieť, tak tí nás pozorujú. Keď napíšeme novinku, tak informujeme všetkých, ktorý nás pozorujú.
private static void observer() {
Noviny noviny = new Noviny();
Blog blog = new Blog();
MojaOsoba mojaOsoba = new MojaOsoba();
mojaOsoba.addObserver(noviny);
mojaOsoba.addObserver(blog);
mojaOsoba.setUdalost("Nastala nová udalosť. Kto o nej bude písať?");
}
public class Noviny implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("Noviny píšu: "+ arg);
}
}
public class Blog implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("Blog píše "+ arg);
}
}
public class MojaOsoba extends Observable {
private String udalost;
public MojaOsoba() {
}
public void setUdalost(String udalost) {
this.udalost = udalost;
setChanged();
notifyObservers(udalost);
}
}
Vždy keď nasetujeme novú udalosť, tak povieme, že sme niečo zmenili a notifikujeme observerov a povieme im, čo sa zmenilo.
Záver
Ak sa chceš o mne dozvedieť viac, tak klikaj na jaroslavbeno.sk alebo ma sleduj na sociálnych sieťach – youtube, facebook, instagram, linkedin.
Ja som Jaro a my sa vidíme, počujeme ak Boh dá nabudúce.
Čaves.