Padrão multitão - Multiton pattern

Diagrama UML do multiton
Diagrama UML do multiton

Na engenharia de software , o padrão multiton é um padrão de projeto que generaliza o padrão singleton . Enquanto o singleton permite que apenas uma instância de uma classe seja criada, o padrão multiton permite a criação controlada de várias instâncias, que ele gerencia por meio do uso de um mapa .

Em vez de ter uma única instância por aplicativo (por exemplo, o java.lang.Runtimeobjeto na linguagem de programação Java ), o padrão multiton garante uma única instância por chave .

A maioria das pessoas e dos livros didáticos considera este um padrão único. Por exemplo, multiton não aparece explicitamente no conceituado livro de texto de programação orientada a objetos Design Patterns (ele aparece como uma abordagem mais flexível chamada registro de singletons ).

Descrição

Embora possa parecer que o multiton é uma tabela hash com acesso sincronizado, há duas distinções importantes. Primeiro, o multiton não permite que os clientes adicionem mapeamentos. Em segundo lugar, o multiton nunca retorna uma referência nula ou vazia; em vez disso, ele cria e armazena uma instância multiton na primeira solicitação com a chave associada. As solicitações subsequentes com a mesma chave retornam a instância original. Uma tabela hash é apenas um detalhe de implementação e não a única abordagem possível. O padrão simplifica a recuperação de objetos compartilhados em um aplicativo.

Como o pool de objetos é criado apenas uma vez, sendo um membro associado à classe (em vez da instância), o multiton retém seu comportamento plano em vez de evoluir para uma estrutura de árvore .

O multitão é único no sentido de que fornece acesso centralizado a um único diretório (ou seja, todas as chaves estão no mesmo namespace, per se ) de multitons, onde cada instância multiton no pool pode existir com seu próprio estado . Dessa maneira, o padrão defende o armazenamento indexado de objetos essenciais para o sistema (como seria fornecido por um sistema LDAP , por exemplo). No entanto, um multiton é limitado ao amplo uso por um único sistema, em vez de uma miríade de sistemas distribuídos.

Inconvenientes

Esse padrão, como o padrão Singleton , torna o teste de unidade muito mais difícil, pois introduz o estado global em um aplicativo.

Com linguagens com coleta de lixo, pode se tornar uma fonte de vazamentos de memória, pois introduz referências fortes globais aos objetos.

Implementações

Em Java, o padrão multiton pode ser implementado usando um tipo enumerado , com os valores do tipo correspondentes às instâncias. No caso de um tipo enumerado com um único valor, isso dá o padrão singleton.

Em C #, também podemos usar enums, como mostra o exemplo a seguir:

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

Referências

links externos