Padrão multitão - Multiton pattern
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);
}
}