Многотонный узор
В разработке программного обеспечения шаблон «многоэлемент» — это шаблон проектирования , который обобщает шаблон «одиночка» . В то время как синглтон позволяет создать только один экземпляр класса, шаблон мультитон допускает контролируемое создание нескольких экземпляров, которыми он управляет с помощью карты .
Вместо того, чтобы иметь один экземпляр для каждого приложения (например, java.lang.Runtime
объект на языке программирования Java ) вместо этого многотонный шаблон обеспечивает один экземпляр для каждого ключа .
Шаблон «многотонность» явно не упоминается как шаблон в уважаемом по объектно-ориентированному программированию « учебнике Шаблоны проектирования» . [1] Однако в книге описывается использование реестра синглтонов , позволяющее создавать подклассы синглтонов. [2] по сути, это многотонный шаблон. [ нужна ссылка ]
Описание
[ редактировать ]Хотя может показаться, что multiton — это хеш-таблица с синхронизированным доступом, есть два важных различия. Во-первых, multiton не позволяет клиентам добавлять сопоставления. Во-вторых, мультитон никогда не возвращает нулевую или пустую ссылку; вместо этого он создает и сохраняет многотонный экземпляр при первом запросе со связанным ключом. Последующие запросы с тем же ключом возвращают исходный экземпляр. Хэш-таблица — это всего лишь деталь реализации, а не единственно возможный подход. Этот шаблон упрощает извлечение общих объектов в приложении.
Поскольку пул объектов создается только один раз, будучи членом, связанным с классом (а не экземпляром), мультитон сохраняет свое плоское поведение, а не развивается в древовидную структуру .
Мультитон уникален тем, что он обеспечивает централизованный доступ к одному каталогу мультитонов (т.е. все ключи находятся в одном и том же пространстве имен, по сути ), где каждый экземпляр мультитона в пуле может существовать, имея свое собственное состояние . Таким образом, шаблон обеспечивает индексированное хранение важных объектов системы ( LDAP например, таких, которые могут быть предоставлены системой ). Однако мультитонна ограничена широким использованием одной системы, а не множеством распределенных систем.
Недостатки
[ редактировать ]Этот шаблон, как и шаблон Singleton , модульное тестирование . значительно усложняет [3] поскольку он вводит глобальное состояние в приложение.
Языки со сборкой мусора могут стать источником утечек памяти, поскольку вводят глобальные сильные ссылки на объекты.
Реализации
[ редактировать ]В Java шаблон multiton можно реализовать с использованием перечислимого типа , значения которого соответствуют экземплярам. В случае перечислимого типа с одним значением это дает шаблон Singleton.
В C# мы также можем использовать перечисления, как показано в следующем примере:
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);
}
}
Ссылки
[ редактировать ]- ^ О'Дочерти, Майк (2005). Объектно-ориентированный анализ и проектирование: понимание разработки систем с помощью UML 2.0 . Чичестер: Уайли. п. 341. ИСБН 0470092408 .
- ^ Шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения . Бостон, Массачусетс, Мюнхен: Аддисон-Уэсли. 2011. с. 130. ИСБН 0-201-63361-2 .
- ^ «Разговоры о чистом коде — глобальное состояние и синглтоны» .