Multitonový vzor - Multiton pattern

UML diagram multiton
UML diagram multiton

V softwarovém inženýrství je multiton vzor je návrhový vzor , který zobecňuje Singleton . Zatímco singleton umožňuje vytvořit pouze jednu instanci třídy, multitonový vzor umožňuje kontrolované vytváření více instancí, které spravuje pomocí mapy .

Spíše než mít jednu instanci na aplikaci (např. java.lang.RuntimeObjekt v programovacím jazyce Java ), multitonový vzor místo toho zajišťuje jednu instanci na klíč .

Většina lidí a učebnic to považuje za singletonový vzor. Například multiton se výslovně neobjevuje ve vysoce ceněné objektově orientované učebnici programovacího designu Design Patterns (vypadá jako flexibilnější přístup s názvem registr singletonů ).

Popis

I když se může zdát, že multiton je hash tabulka se synchronizovaným přístupem, existují dva důležité rozdíly. Nejprve multiton neumožňuje klientům přidávat mapování. Za druhé, multiton nikdy nevrací nulovou nebo prázdnou referenci; místo toho vytvoří a uloží instanci multiton na první požadavek s přidruženým klíčem. Následné žádosti se stejným klíčem vrátí původní instanci. Tabulka hash je pouze detail implementace a není jediným možným přístupem. Vzor zjednodušuje načítání sdílených objektů v aplikaci.

Vzhledem k tomu, že fond objektů je vytvořen pouze jednou a je členem přidruženým ke třídě (namísto instance), multiton si zachovává své ploché chování, místo aby se vyvinul do stromové struktury .

Multiton je jedinečný v tom, že poskytuje centralizovaný přístup k jednomu adresáři (tj. Všechny klíče jsou samy ve stejném oboru jmen ) multitonů, kde každá instance multiton ve fondu může existovat a má svůj vlastní stav . Tímto způsobem vzor obhajuje indexované úložiště základních objektů pro systém (například poskytované systémem LDAP ). Multiton je však omezen na široké použití jediným systémem, spíše než na nesčetné množství distribuovaných systémů.

Nevýhody

Tento vzor, ​​stejně jako vzor Singleton , značně ztěžuje testování jednotek , protože do aplikace zavádí globální stav .

S uvolněnými jazyky se může stát zdrojem úniku paměti, protože zavádí globální silné odkazy na objekty.

Implementace

V Javě lze vzor multiton implementovat pomocí výčtu typu , přičemž hodnoty typu odpovídají instancím. V případě výčtu typu s jedinou hodnotou to dává singletonový vzor.

V C # můžeme také použít výčty, jak ukazuje následující příklad:

using System;
using System.Collections.Generic;

public enum MultitonType
{
    Zero,
    One,
    Two
}

public class Multiton
{
    private static readonly Dictionary<MultitonType, Multiton> instances =
        new Dictionary<MultitonType, Multiton>();

    private MultitonType type;

    private Multiton(MultitonType type)
    {
        this.type = type;
    }

    public static Multiton GetInstance(MultitonType type)
    {
        // Lazy init (not thread safe as written)
        // Recommend using Double Check Locking if needing thread safety
        if (!instances.TryGetValue(type, out var instance))
        {
            instance = new Multiton(type);

            instances.Add(type, instance);
        }

        return instance;
    }

    public override string ToString()
    {
        return "My type is " + this.type;
    }

    // Sample usage
    public static void Main()
    {
        var m0 = Multiton.GetInstance(MultitonType.Zero);
        var m1 = Multiton.GetInstance(MultitonType.One);
        var m2 = Multiton.GetInstance(MultitonType.Two);

        Console.WriteLine(m0);
        Console.WriteLine(m1);
        Console.WriteLine(m2);
    }
}

Reference

externí odkazy