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