Modello multiton - Multiton pattern

Diagramma UML del multiton
Diagramma UML del multiton

In ingegneria del software , il modello multiton è un modello di progettazione che generalizza il pattern Singleton . Mentre il singleton consente la creazione di una sola istanza di una classe, il pattern multiton consente la creazione controllata di più istanze, che gestisce tramite l'uso di una mappa .

Piuttosto che avere una singola istanza per applicazione (es. l' java.lang.Runtimeoggetto nel linguaggio di programmazione Java ) il modello multiton assicura invece una singola istanza per chiave .

La maggior parte delle persone e dei libri di testo considerano questo un modello singleton. Ad esempio, multiton non appare esplicitamente nel libro di testo di programmazione orientato agli oggetti molto apprezzato Design Patterns (appare come un approccio più flessibile chiamato registro dei singleton ).

Descrizione

Sebbene possa sembrare che il multiton sia una tabella hash con accesso sincronizzato, ci sono due importanti distinzioni. Innanzitutto, il multiton non consente ai client di aggiungere mappature. In secondo luogo, il multitone non restituisce mai un riferimento nullo o vuoto; invece, crea e archivia un'istanza multiton sulla prima richiesta con la chiave associata. Le richieste successive con la stessa chiave restituiscono l'istanza originale. Una tabella hash è semplicemente un dettaglio di implementazione e non l'unico approccio possibile. Il modello semplifica il recupero di oggetti condivisi in un'applicazione.

Poiché il pool di oggetti viene creato una sola volta, essendo un membro associato alla classe (invece che all'istanza), il multiton mantiene il suo comportamento flat piuttosto che evolversi in una struttura ad albero .

Il multiton è unico in quanto fornisce l'accesso centralizzato a una singola directory (cioè tutte le chiavi sono nello stesso namespace, di per sé ) di multiton, dove ogni istanza di multiton nel pool può esistere con il proprio stato . In questo modo, il modello sostiene l'archiviazione indicizzata di oggetti essenziali per il sistema (come sarebbe fornito da un sistema LDAP , ad esempio). Tuttavia, un multiton è limitato all'ampio utilizzo da parte di un singolo sistema piuttosto che da una miriade di sistemi distribuiti.

Svantaggi

Questo modello, come il modello Singleton , rende il test delle unità molto più difficile, poiché introduce lo stato globale in un'applicazione.

Con i linguaggi raccolti in modo spazzatura può diventare una fonte di perdite di memoria poiché introduce forti riferimenti globali agli oggetti.

implementazioni

In Java, il pattern multiton può essere implementato utilizzando un tipo enumerato , con i valori del tipo corrispondenti alle istanze. Nel caso di un tipo enumerato con un singolo valore, questo fornisce il modello singleton.

In C#, possiamo anche usare enum, come mostra l'esempio seguente:

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

Riferimenti

link esterno