Multiton minta - Multiton pattern
A szoftverfejlesztésben a multiton minta olyan tervezési minta, amely általánosítja a szingulett mintát . Míg a szingulett egy osztálynak csak egy példányát teszi lehetővé, a multiton minta lehetővé teszi több példány ellenőrzött létrehozását, amelyet egy térkép segítségével kezel .
Ahelyett, hogy egy példány egy alkalmazás (pl java.lang.Runtimeobjektumot a Java programozási nyelv ) a többke programtervezési minta helyett biztosít egyetlen példányát egy gombot .
A legtöbb ember és tankönyv ezt egyedülálló mintának tartja. Például a multiton nem jelenik meg kifejezetten a nagyra értékelt objektum-orientált programozási tankönyv Design Patterns-ben (ez rugalmasabb megközelítésként jelenik meg, a szingletonok nyilvántartása néven ).
Leírás
Bár úgy tűnhet, hogy a multiton szinkronizált hozzáféréssel rendelkező hash tábla , két fontos különbség van. Először is, a multiton nem teszi lehetővé az ügyfelek számára a leképezések hozzáadását. Másodszor, a multiton soha nem tér vissza a null vagy üres hivatkozás; ehelyett egy multiton példányt hoz létre és tárol az első kérésre a társított kulccsal. A későbbi kérések ugyanazzal a kulccsal adják vissza az eredeti példányt. A hash tábla pusztán a megvalósítás részlete, és nem az egyetlen lehetséges megközelítés. A minta leegyszerűsíti a megosztott objektumok visszakeresését egy alkalmazásban.
Mivel az objektumkészlet csak egyszer jön létre, mivel az osztályhoz társított tag (a példány helyett), a multiton megtartja lapos viselkedését, nem pedig fa struktúrává fejlődik .
A multiton egyedülálló abban, hogy ez biztosítja a központosított hozzáférést egy könyvtárat (vagyis minden gomb azonos névtérben, önmagában ) a multitons, ahol minden multiton például a medencében lehetnek, ha saját állapotát . Ilyen módon a minta támogatja a rendszer alapvető objektumainak indexelt tárolását (például egy LDAP rendszer biztosítja). A multiton azonban csak egyetlen rendszer széles körű használatára korlátozódik, nem pedig számtalan elosztott rendszerre.
Hátrányok
Ez a minta, hasonlóan a Singleton mintához , sokkal nehezebbé teszi az egység tesztelését , mivel bevezeti az alkalmazást a globális állapotba .
A szemétgyűjtő nyelvekkel memóriaszivárgássá válhat, mivel globálisan erős hivatkozásokat vezet be az objektumokra.
Végrehajtások
A Java-ban a multiton mintázat felsorolt típus segítségével valósítható meg , a típus értéke megfelel a példányoknak. Egy értékű, felsorolt típus esetén ez adja a szingulett mintát.
A C # -ban enumokat is használhatunk, amint azt a következő példa mutatja:
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);
}
}