Seriál návrhových vzorů – 2. díl – static factory method, servant
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Seriál návrhových vzorů – 2. díl – static factory method, servantSeriál návrhových vzorů – 2. díl – static factory method, servant

 

Seriál návrhových vzorů – 2. díl – static factory method, servant

Google       Google       16. 7. 2012       31 222×

Po tom, co jsme si v minulém díle seriálu vysvětlili princip návrhových vzorů, se nyní podíváme na další dva z našeho výběru. Tentokrát to bude static factory method (statická tovární metoda) a servant (služebník).

Reklama
Reklama

Jelikož už víme, co to návrhové vzory jsou, nebudeme dlouho chodit kolem horké kaše a rovnou se podíváme na další dva zástupce.

Static factory method (statická tovární metoda)

Static factory method je návrhový vzor, který použijeme většinou při práci v týmech na rozsáhlých projektech. Není to samozřejmě podmínkou. Je založen na principu privátního konstruktoru, ke kterému se tedy přímo nepřistupuje, nýbrž volá se prostřednictvím statických metod.

Na první pohled zbytečná složitost však ve výsledku přinese mnoho dobrého. První (estetickou) výhodou je, že metodu si můžeme pojmenovat (na rozdíl od konstruktoru) jak chceme, což přináší jisté zlepšení přehlednosti. Druhou výhodou (a kvůli tomu se tento vzor používá) je napsání statických metod přesně podle logických požadavků navrhovaného systému. Vrhněme se nyní na ukázku, která nám vše vysvětlí.

Mějme firemní systém, který bude evidovat domy. Domy mají spoustu různých vlastností (budou to tedy instanční atributy), ale naše fiktivní firma má v evidenci pouze jednopatrové a dvoupatrové domy. Budeme-li tedy vytvářet instanci domu, nejprve rozhodneme, jestli bude náš dům jednopatrový či dvoupatrový a ostatní atributy budou nastaveny dále, individuálně.

class Dum {
   /*
    * Definice různých atributů.
    */
    private final int pocetPoschodi;
    
    private Dum(int pocetPoschodi){
        this.pocetPoschodi = pocetPoschodi;
    }
    
    public static Dum getJednoposchodovyDum(){
        return new Dum(1);
    }
    
    public static Dum getDvouposchodovyDum(){
        return new Dum(2);
    }
}

public class Domy {

    public static void main(String[] args) {
        Dum prvni = Dum.getJednoposchodovyDum();
       
        /*
         * Další práce s jednoposchoďovým domem.
         */
       
    }
}

Jakožto autoři této třídy jsme tedy jednoduše ošetřili, aby autoři jiných tříd, které tuto využívají, nevytvářeli sedmiposchoďové domy. K čemu by to také bylo? Logicky, vždyť firma se zabývá pouze jednopatrovými a dvoupatrovými - nemá smysl brát v úvahu jiné varianty.

Servant (služebník)

Návrhový vzor Servant je vzor, který se používá k přidání funkce určité množině třídy bez zásahu do jejich kódu tak, abychom se vyhnuli opakování stejného nebo podobného kódu.

Mezi servantem a obsluhovanými musí existovat jakási dohoda, určující co mají obsluhované třídy umět. To v praxi provedeme samozřejmě použitím rozhraní, které implementují všechny třídy využívající servanta. Metodám tohoto servanta pak jako parametr předáváme objekt, který má implementované právě toto rozhraní. Ukážeme si na příkladě.

Mějme dvě skupiny osob, muže a ženy. Zástupci obou skupin mají hmotnost a výšku, jsou tedy měřitelní. Využijeme servanta k tomu, aby díky vědomí, že každý, kdo je měřitelný, počítal BMI. Jedinou otázkou je, jak takového „jednoduchého“ servanta pojmenovat. Pro náš ukázkový případ, kdy servant pracuje s měřitelnými objekty (tedy implementujícími rozhraní IMeritelny), ho nazveme například Měřič. Název je vskutku celkem důležitý, jelikož v rozsáhlejších systémech se servantů běžně používá několik, a tak pojmenování "Servant" není úplně vhodné.

interface IMeritelny {

    public double getVyska();

    public double getVaha();
}

class Zena implements IMeritelny {

    private double vaha;
    private double vyska;

    @Override
    public double getVaha() {
        return vaha;
    }

    @Override
    public double getVyska() {
        return vyska;
    }
}

class Muz implements IMeritelny {

    private double vaha;
    private double vyska;

    @Override
    public double getVaha() {
        return vaha;
    }

    @Override
    public double getVyska() {
        return vyska;
    }
}

class Meric {

    public double BMI(IMeritelny objekt) {
        double bmi = objekt.getVaha() / (objekt.getVyska() * objekt.getVyska());
        return bmi;
    }
    
}

public class UkazkaServant {

    public static void main(String[] args) {
        Zena z = new Zena();
        Muz m = new Muz();
        
        Meric meric = new Meric();
        double bmiZeny = meric.BMI(z);
        double bmiMuze = meric.BMI(m);
    }
}

Nutno podotknout, že tato ukázka je velmi krajní případ. Muž a žena by museli mít mnoho a velmi odlišných vlastností, abychom je vůbec definovali jako dvě různé třídy namísto jedné. Jde mi však o důvod a způsob použití tohoto návrhového vzoru a to je z toho, myslím, jasně vidět.

Závěrem

Doufám, že jsem vám tímto dílem seriálu pomohl osvětlit další zákoutí labyrintu návrhových vzorů. Máte-li k nim jakékoliv otázky, neváhejte se ptát v komentářích.

×Odeslání článku na tvůj Kindle

Zadej svůj Kindle e-mail a my ti pošleme článek na tvůj Kindle.
Musíš mít povolený příjem obsahu do svého Kindle z naší e-mailové adresy kindle@programujte.com.

E-mailová adresa (např. novak@kindle.com):

TIP: Pokud chceš dostávat naše články každé ráno do svého Kindle, koukni do sekce Články do Kindle.

Hlasování bylo ukončeno    
17 hlasů
Google
(fotka) Radek BoudaRadek Bouda studuje na Fakultě aplikovaných věd Západočeské univerzity v Plzni. Programuje v jazyce Java a zajímá se platformu .NET. Kromě programování má rád také cyklistiku, volejbal, skauting a pohyb venku obecně.
Web     Twitter     Facebook    

Nové články

Reklama
Reklama
Obrázek ke článku Mobilní datový provoz vzroste sedmkrát.

Mobilní datový provoz vzroste sedmkrát.

Už v roce 2021 bude mít více obyvatel zeměkoule mobilní telefon (5,5 miliardy) než bankovní účet (5,4 miliardy), tekoucí vodu (5,3 miliardy) nebo pevnou telefonní linku (2,9 miliardy). Vyplývá to z analytické studie Cisco Visual Networking Index (VNI) Global Mobile Data Traffic Forecast (2016 to 2021). Analytici také předpovídají, že se tento výrazný růst, spolu s rozmachem chytrých telefonů a připojení do internetu věcí promítne i do celkového objemu přenesených mobilních dat. Studie říká, že do roku 2021 vzroste sedminásobně, k čemuž přispěje i zvyšování přenosové rychlosti sítí a nárůst sledování videa na mobilních zařízeních.

loadingtransparent (function() { var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = 'https://apis.google.com/js/plusone.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); })();
Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032017 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý