Multiton

Návrhový vzor Multiton je obdobou návrhového vzoru Singleton. Zásadní rozdíl spočívá v tom, že zatímco u Singletonu existuje pouze jediná instance třídy, u Multitonu existuje jedna instance pro každý klíč (každý rozlišitelný stav). Výhodou tohoto přístupu jsou nižší nároky na pamět a vytvoření vždy jen jedné instance pro každý stav (vytváření může být nákladné).

Příklad

Mějme třídu, která reprezentuje čísla. Protože víme, že se používají především čísla 0-9, tak na tato čísla použijeme vzor Multiton, abychom ušetřili místo v paměti.

/**
 * Priklad pro navrhovy vzor Multiton
 * @author Pavel Micka
 */
class Number{
    /**
     * Holder na cisla 0-9
     */
    private static final Number[] numbers = new Number[10];
    /**
     * Hodnota cisla
     */
    private int value;
    /**
     * Konstruktor
     * @param nr hodnota cisla
     */
    private Number(int nr) {
        this.value = nr;
    }
    /**
     * Vrati instanci cisla
     * 0-9 multiton, ostatni nova instance
     * @param nr cislo, ktere ma byt vraceno
     * @return cislo
     */
    public static Number getInstance(int nr){
        if(nr >= 10) return new Number(nr);
        else{
            synchronized(Number.class){
                if(numbers[nr] == null) numbers[nr] = new Number(nr);
                return numbers[nr];
            }
        }
    }
    /**
     * Vrati hodnotu cisla
     * @return hodnota cisla
     */
    public int getValue(){
        return value;
    }
}

Literatura

  • PECINOVSKÝ, Rudolf. Návrhové vzory. 1. vyd. [s.l.] : Computer press, 2007. 527 s. ISBN 978-80-2511582-4.
{ zpětná vazba }
Delicious Delicious
Sdílet
Hodnocení (1): 3

Přečtěte si také

Diskuse





Pavel Mička22.11.2010
Přesně tak, v multitonu má být pro každý typ vytvořen pouze jeden objekt (můžeme si představit, že je tvorba objektu velmi náročná a drahá, případně že dva nemohou existovat z nějakého logického důvodu). Kdyby tam synchronizace nebyla a došlo by k nešťastnému souběhu několika dvou (nebo více) vláken na podmínce, tak první provede kontrolu podmínky a projde - a dojde k přepnutí vlákna na jiné, před podmínkou. Toto vláknno opět provede kontrolu podmínky (ta pořád prochází) a pokračuje opět do kritické sekce. Tímto způsobem by mohlo při dostatečně velké smůle projít podmínkou libovolné množství vláken a navytvářet daný "drahý" objekt mnohokrát. Synchronizace zajistí, že v dané sekci bude vždy maximálně jedno vlákno (vždy vznikne pouze jeden objekt, protože se k podmínce další vlákna dostanou až v okamžiku, kdy je zneplatněna).
Vojtěch Sejkora22.11.2010
Prosím váš k čemy je dobré to synchronizovat? a pochopil jsme dobře, že testujete jeslti jste už náhodou tento objekt nevytvořil
vojta25.8.2010
Pardon, psal jsem rychleji než četl... můžeš mě smazat :).
vojta25.8.2010
Nevíš, jaký je vztah mezi tímto vzorem a Flyweight? Vypadají hodně podobně.
Pavel Mička5.11.2009
Neni :-)...flyweight pojednava o tom, ze chces minimalizovat mnozstvi objektu (doposud stejne), ale tim zpusobem, ze predavas stav objektu pomoci metod...proste ze budes mit treba omezeny mnozstvi instanci tridy "Clovek" a budes jim v metodach predavat "vek", "pohlavi", atp....zatimco multiton je rozsireni singletonu na mnoho instanci...treba v jave trida Integer obsahuje multiton na integery -128 az 127, cili eliminujes instance tim, ze nenechas totoznych objektu vytvorit vic :-)...no...snad jsem to vysvetlil a nezatemnil jeste vic :-)
pytel3.11.2009
Neni to nahodou GoF Flyweight?