Multitonový vzor - Multiton pattern

UML diagram multiton
UML diagram multiton

v softwarové inženýrství, multitonový vzor je návrhový vzor který zobecňuje singletonový vzor. Vzhledem k tomu, že jedináček umožňuje vytvoření pouze jedné instance třídy, vzor multiton umožňuje řízené vytváření více instancí, které spravuje pomocí mapa.

Spíše než mít jedinou instanci na aplikaci (např java.lang.Runtime objekt v Programovací jazyk 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[Citace je zapotřebí ]. Například multiton se výslovně neobjevuje ve vysoce ceněných objektově orientované programování učebnice Designové vzory (vypadá to jako flexibilnější přístup pojmenovaný registr singletonů).

Popis

I když se může zdát, že multiton je a 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á struktura.

Multiton je jedinečný v tom, že poskytuje centralizovaný přístup k jednomu adresáři (tj. Všechny klíče jsou ve stejném jmenném prostoru, per se) multitonů, kde každá instance multiton ve fondu může existovat a má svůj vlastní stav. Tímto způsobem vzor podporuje indexované úložiště základních objektů pro systém (jako by bylo poskytnuto pomocí LDAP systém). 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, ​​jako Singleton vzor, dělá testování jednotky mnohem obtížnější,[1] jak to zavádí globální stav do aplikace.

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 multitonový vzor implementovat pomocí vyjmenovaný typ, s hodnotami typu odpovídajícími 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:

 1 použitím Systém; 2 použitím System.Collections.Generic; 3  4 veřejnost výčet MultitonType 5 { 6     Nula, 7     Jeden, 8     Dva 9 }10 11 veřejnost třída Multiton12 {13     soukromé statický pouze ke čtení Slovník<MultitonType, Multiton> instance =14         Nový Slovník<MultitonType, Multiton>();15 16     soukromé MultitonType typ;17 18     soukromé Multiton(MultitonType typ)19     {20         tento.typ = typ;21     }22 23     veřejnost statický Multiton GetInstance(MultitonType typ)24     {25         // Lazy init (není bezpečné pro vlákna, jak je napsáno)26         // Pokud potřebujete bezpečnost závitu, doporučujeme použít funkci Double Check Locking27         -li (!instance.TryGetValue(typ, ven var instance))28         {29             instance = Nový Multiton(typ);30 31             instance.Přidat(typ, instance);32         }33 34         vrátit se instance;35     }36 37     veřejnost přepsat tětiva ToString()38     {39         vrátit se „Můj typ je“ + tento.typ;40     }41 42     // Využití vzorku43     veřejnost statický prázdnota Hlavní()44     {45         var m0 = Multiton.GetInstance(MultitonType.Nula);46         var m1 = Multiton.GetInstance(MultitonType.Jeden);47         var m2 = Multiton.GetInstance(MultitonType.Dva);48 49         Řídicí panel.WriteLine(m0);50         Řídicí panel.WriteLine(m1);51         Řídicí panel.WriteLine(m2);52     }53 }

Reference

  1. ^ „Clean Code Talks - Global State and Singletons“.

externí odkazy