Multiton-kuvio - Multiton pattern

Multitonin UML-kaavio
Multitonin UML-kaavio

In Software Engineering The multiton kuvio on designkuvio joka yleistää singleton kuvio . Vaikka singleton sallii luoda vain yhden luokan esiintymän, monitahoinen malli mahdollistaa useiden instanssien hallitun luomisen, joita se hallitsee kartan avulla .

Sen sijaan, että sillä olisi yksi ilmentymä sovellusta kohti (esim. java.lang.RuntimeObjekti Java-ohjelmointikielellä ), monitoimikuvio varmistaa sen sijaan yhden esiintymän avainta kohti .

Suurin osa ihmisistä ja oppikirjoista pitää tätä yksittäisenä mallina. Esimerkiksi multiton ei ole nimenomaisesti esillä arvostetussa olio-ohjelmoinnin oppikirjassa Design Patterns (se esiintyy joustavampana lähestymistapana, jonka nimi on singletonien rekisteri ).

Kuvaus

Vaikka näyttää siltä, ​​että multiton on hash-taulukko, jossa on synkronoitu pääsy, on kaksi tärkeää eroa. Ensinnäkin multiton ei salli asiakkaiden lisätä kartoituksia. Toiseksi, multiton ei koskaan palauta nollaa tai tyhjää viitettä; sen sijaan se luo ja tallentaa monitahoisen ilmentymän ensimmäiseen pyyntöön ja siihen liittyvän avaimen. Seuraavat pyynnöt, joissa on sama avain, palauttavat alkuperäisen instanssin. Hajautustaulukko on vain toteutustiedot eikä ainoa mahdollinen lähestymistapa. Kuvio yksinkertaistaa jaettujen objektien hakemista sovelluksessa.

Koska objektijoukko luodaan vain kerran, ollessaan luokkaan liitetty jäsen (esimerkin sijasta), multiton säilyttää tasaisen käyttäytymisensä sen sijaan, että siitä tulisi puurakenne .

Multiton on ainutlaatuinen siinä mielessä, että se tarjoaa keskitetyn pääsyn yhteen monihuonetiedostojen hakemistoon (ts. Kaikki avaimet ovat sinänsä samassa nimitilassa ), jossa kullakin altaan multiton-ilmentymällä voi olla oma tila . Tällä tavoin kuvio tukee järjestelmän olennaisen objektin indeksoitua tallennusta (kuten esimerkiksi LDAP- järjestelmä tarjoaisi ). Multiton on kuitenkin rajoitettu laajaan käyttöön yhdellä järjestelmällä eikä lukemattomilla hajautetuilla järjestelmillä.

Haittoja

Tämä malli, kuten Singleton-malli , vaikeuttaa yksiköiden testausta , koska se tuo globaalin tilan sovellukseen.

Roskat kerätyillä kielillä siitä voi tulla muistivuodon lähde, kun se tuo globaalit vahvat viitteet esineisiin.

Toteutukset

Java-ohjelmassa monitahoinen malli voidaan toteuttaa käyttämällä lueteltua tyyppiä , tyypin arvot vastaavat esiintymiä. Jos kyseessä on lueteltu tyyppi, jolla on yksi arvo, tämä antaa singleton-mallin.

C #: ssä voimme käyttää myös enumeja, kuten seuraava esimerkki osoittaa:

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

Viitteet

Ulkoiset linkit