Multiton mönster - Multiton pattern

UML-diagram för multiton
UML-diagram för multiton

Inom mjukvaruteknik är multitonmönstret ett designmönster som generaliserar singletonmönstret . Medan singleton endast tillåter en instans av en klass att skapas, möjliggör multitonmönstret kontrollerad skapande av flera instanser, som den hanterar genom användning av en karta .

I stället för att ha en enda instans per applikation (t.ex. java.lang.Runtimeobjektet i Java-programmeringsspråket ) säkerställer multitonmönstret istället en enda instans per nyckel .

De flesta människor och läroböcker anser att detta är ett singletonmönster. Till exempel, multiton inte uttryckligen visas i den ansedda objektorienterad programmering lärobok designmönster (det verkar som ett mer flexibelt tillvägagångssätt som heter register över single ).

Beskrivning

Även om det kan tyckas att multitonen är en hash-tabell med synkroniserad åtkomst finns det två viktiga skillnader. För det första tillåter multiton inte klienter att lägga till mappningar. För det andra returnerar multitonen aldrig en null eller tom referens; istället skapar och lagrar den en multitoninstans vid den första begäran med tillhörande nyckel. Efterföljande förfrågningar med samma nyckel returnerar den ursprungliga instansen. En hash-tabell är bara en implementeringsdetalj och inte den enda möjliga metoden. Mönstret förenklar hämtning av delade objekt i en applikation.

Eftersom objektpoolen skapas bara en gång, eftersom den är medlem associerad med klassen (i stället för förekomsten), behåller multitonen sitt platta beteende snarare än att utvecklas till en trädstruktur .

Multitonet är unikt genom att det ger central åtkomst till en enda katalog (dvs. alla tangenter är i samma namnrymd i sig ) för multitoner, där varje multitoninstans i poolen kan existera med sitt eget tillstånd . På detta sätt förespråkar mönstret indexerad lagring av väsentliga objekt för systemet (som till exempel skulle tillhandahållas av ett LDAP- system). Ett multiton är dock begränsat till bred användning av ett enda system snarare än en myriad av distribuerade system.

Nackdelar

Detta mönster, precis som Singleton-mönstret , gör enhetstester mycket svårare, eftersom det introducerar global stat i en applikation.

Med skräpsamlade språk kan det bli en källa till minnesläckage eftersom det introducerar globala starka referenser till objekten.

Implementeringar

I Java kan multitonmönstret implementeras med en uppräknad typ , med värdena av typen som motsvarar instanserna. När det gäller en uppräknad typ med ett enda värde ger detta singletonmönstret.

I C # kan vi också använda enums, som följande exempel visar:

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);
    }
}

Referenser

externa länkar