В программной инженерии шаблон multiton является шаблоном проектирования , который обобщает шаблон singleton . В то время как singleton позволяет создать только один экземпляр класса, шаблон multiton позволяет контролируемое создание нескольких экземпляров, которым он управляет с помощью map .
Вместо того чтобы иметь один экземпляр на приложение (например, java.lang.Runtime
объект в языке программирования Java ), шаблон multiton обеспечивает один экземпляр на ключ .
Шаблон «Мультитоны» явно не появляется как шаблон в высоко оцененном учебнике по объектно-ориентированному программированию « Шаблоны проектирования» . [1] Однако в книге описывается использование реестра синглтонов для создания подклассов синглтонов, [2] что по сути является шаблоном «Мультитоны». [ требуется ссылка ]
Хотя может показаться, что multiton — это хэш-таблица с синхронизированным доступом, есть два важных отличия. Во-первых, multiton не позволяет клиентам добавлять сопоставления. Во-вторых, multiton никогда не возвращает нулевую или пустую ссылку; вместо этого он создает и сохраняет экземпляр multiton при первом запросе с соответствующим ключом. Последующие запросы с тем же ключом возвращают исходный экземпляр. Хэш-таблица — это всего лишь деталь реализации, а не единственный возможный подход. Шаблон упрощает извлечение общих объектов в приложении.
Поскольку пул объектов создается только один раз, являясь членом, связанным с классом (а не экземпляром), мультитон сохраняет свое плоское поведение, а не превращается в древовидную структуру .
Multiton уникален тем, что он обеспечивает централизованный доступ к единому каталогу (т. е. все ключи находятся в одном пространстве имен, по сути ) multiton, где каждый экземпляр multiton в пуле может существовать, имея свое собственное состояние . Таким образом, шаблон выступает за индексированное хранение важных объектов для системы (например, такое, которое будет предоставлено системой LDAP ). Однако multiton ограничен широким использованием одной системы, а не множеством распределенных систем.
Этот шаблон, как и шаблон Singleton , значительно затрудняет модульное тестирование [3], поскольку он вводит глобальное состояние в приложение.
В языках со сборкой мусора это может стать источником утечек памяти, поскольку вводит глобальные строгие ссылки на объекты.
В Java шаблон multiton может быть реализован с использованием перечислимого типа , со значениями типа, соответствующими экземплярам. В случае перечислимого типа с одним значением это дает шаблон singleton.
В C# мы также можем использовать перечисления, как показано в следующем примере:
с использованием Системы ; с использованием System.Collections.Generic ; публичное перечисление MultitonType { Ноль , Один , Два}общественный класс Multiton { частный статический словарь только для чтения < MultitonType , Multiton > экземпляры = новый Словарь < MultitonType , Multiton > (); частный тип MultitonType ; частный Multiton ( тип MultitonType ) { этот . тип = тип ; } публичный статический Multiton GetInstance ( тип MultitonType ) { // Ленивая инициализация (не потокобезопасна, как написано) // Рекомендуем использовать Double Check Locking, если нужна потокобезопасность если ( ! instances.TryGetValue ( type , out var instance ) ) { экземпляр = новый Мультитон ( тип ); экземпляры . Добавить ( тип , экземпляр ); } возвратить экземпляр ; } публичная переопределенная строка ToString () { return "Мой тип - " + this . type ; } // Пример использования публичный статический void Main () { var m0 = Multiton.GetInstance ( MultitonType.Zero ) ; var m1 = Multiton.GetInstance ( MultitonType.One ) ; var m2 = Multiton.GetInstance ( MultitonType.Two ) ; Консоль.WriteLine ( m0 ) ; Консоль.WriteLine ( m1 ) ; Консоль.WriteLine ( m2 ) ; }}