Multiton minta - Multiton pattern

A multiton UML-diagramja
A multiton UML-diagramja

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

Hivatkozások

Külső linkek