Návrhové vzory Java (design patterns): Abstract Factory

V tomto článku sa pozrieme na posledný návrhový vzor Abstract Factory (java design patterns) z kategórie vzorov určených na vytváranie objektov (creational patterns).

Prečítaj si o ďalších design patterns – seriál návrhových vzorov:

Čo to je návrhový vzor Abstract Factory?

Návrhový vzor Abstract Factory (abstraktná továreň) je jedným z tzv. creational (tvorivých) návrhových vzorov v softvérovom inžinierstve. Cieľom tohto vzoru je poskytnúť rozhranie pre vytváranie rodín súvisiacich objektov bez špecifikovania ich konkrétnych tried.

Aký problém návrhový vzor Abstract Factory rieši?

Abstract Factory rieši problém vytvárania inštancií tried, ktoré majú spoločné rozhranie alebo sú súčasťou rovnakej rodiny tried. Design pattern Abstract Factory je založený na princípe abstrakcie. Poskytuje rozhranie, ktoré definuje metódy na vytváranie objektov. Konkrétne implementácie tohto rozhrania reprezentujú jednotlivé továrne, ktoré vytvárajú inštancie konkrétnych tried. Pomáha oddeliť proces vytvárania objektov od ich použitia a umožňuje jednoduchú výmenu celej rodiny objektov za inú, bez toho, aby sme menili kód, ktorý používa tieto objekty.

Príklad Abstract Factory implementácie v Jave

Teraz si ukážeme ako implementovať vzor Abstract Factory v Jave. Tento príklad ilustruje, ako vzor Abstract Factory umožňuje vytváranie rodín súvisiacich objektov bez potreby špecifikovania ich konkrétnych tried v kóde. V tomto prípade je to továreň na výrobu čokolády a nugátu od výrobcu Lindt.

Rozhranie CokoladaAbstractFactory – definuje dve metódy vyrobCokoladu() a vyrobNugat(), ktoré majú vrátiť objekty typu Cokolada a Nugat zodpovedajúcich tovární. Toto rozhranie reprezentuje abstraktnú továreň na čokoládu.

package designpatterns;

// Rozhranie pre abstraktnu vyrobnu cokoladu
public interface CokoladaAbstractFactory {
    Cokolada vyrobCokoladu();
    Nugat vyrobNugat();
}

Trieda LindtFactory – implementuje rozhranie CokoladaAbstractFactory a poskytuje implementácie metód vyrobCokoladu() a vyrobNugat(). Táto trieda je konkrétnou implementáciou abstraktnej továrne na čokoládu pre výrobcu Lindt.

package designpatterns;

// Vyrobca Lindt cokolady implementuje AbstractFactory
public class LindtFactory implements CokoladaAbstractFactory {
    public Cokolada vyrobCokoladu() {
        return new LindtCokolada();
    }

    public Nugat vyrobNugat() {
        return new LindtNugat();
    }
}

Rozhranie Cokolada – definuje metódu zobrazTyp(), ktorá je implementovaná v triede LindtCokolada. Toto rozhranie reprezentuje typ čokolády.

package designpatterns;

// Rozhranie pre cokoladu
public interface Cokolada {
    void zobrazTyp();
}

Trieda LindtCokolada – implementuje rozhranie Cokolada a definuje metódu zobrazTyp(), ktorá vypisuje informácie o čokoláde.

package designpatterns;

// Konkretna implementacia Lindt cokolady
public class LindtCokolada implements Cokolada {
    public void zobrazTyp() {
        System.out.println("Lindt čokoláda");
    }
}

Rozhranie Nugat – definuje metódu zobrazTyp(), ktorá je implementovaná v triede LindtNugat. Toto rozhranie reprezentuje typ nugátu.

package designpatterns;

// Rozhranie pre nugat
public interface Nugat {
    void zobrazTyp();
}

Trieda LindtNugat – implementuje rozhranie Nugat a definuje metódu zobrazTyp(), ktorá vypisuje informácie o nugáte.

package designpatterns;

// Konkretna implementacia Lindt nugatu
public class LindtNugat implements Nugat {
    public void zobrazTyp() {
        System.out.println("Lindt nugát");
    }
}

Trieda Main: Obsahuje metódu main(), kde je demonštrované použitie abstraktnej továrne. Vytvára sa inštancia LindtFactory, ktorá je typu CokoladaAbstractFactory. Následne sa pomocou tejto abstraktnej továrne vytvárajú objekty Cokolada a Nugat. Nakoniec sa volajú metódy zobrazTyp() na týchto objektoch, čo vypíše informácie o čokoláde a nugáte.

import designpatterns.Cokolada;
import designpatterns.CokoladaAbstractFactory;
import designpatterns.LindtFactory;
import designpatterns.Nugat;

// Priklad pouzitia Abstract Factory
public class Main {
    public static void main(String[] args) {
        // Vytvorenie abstraknej tovarne na cokoladu
        CokoladaAbstractFactory cokoladaFactory = new LindtFactory();

        // Vyroba cokolady a nugatu pomocou abstraktnej tovarne
        Cokolada cokolada = cokoladaFactory.vyrobCokoladu();
        Nugat nugat = cokoladaFactory.vyrobNugat();

        // A zobrazenie informacii o nich
        cokolada.zobrazTyp();
        nugat.zobrazTyp();
    }
}

Všimni si, že použitím návrhového vzoru Abstract Factory je možné jednoducho vymeniť inštanciu LindtFactory za hociktorú inú inštanciu implementujúcu rozhranie CokoladaAbstractFactory a zvyšok kódu sa nezmení. Napríklad by sme si mohli vytvoriť továreň MilkaFactory na výrobu čokolády Milky.

Výstup programu použitím návrhového vzoru Abstract Factory
Výstup programu použitím návrhového vzoru Abstract Factory

Pripravili sme pre teba súbory so spomínaným príkladom vo forme kódu, ktorý si môžeš spustiť priamo v Jave. Stiahni si kód Java Abstract Factory tu.

Ak si hľadáš prácu a si Java programátor, prečítaj si viac o plate programátora a pozri si naše voľné pracovné miesta.

O autorovi

Jozef Wagner

Java Developer Senior

Viac ako 10 rokov programujem v Jave, momentálne pracujem v msg life Slovakia ako Java programátor senior a pomáham zákazníkom implementovať ich požiadavky do poistného softvéru Life Factory. Vo voľnom čase si rád oddýchnem v lese, prípadne si zahrám nejakú dobrú počítačovú hru.

Daj nám o sebe vedieť