Из Википедии, свободной энциклопедии
Перейти к навигации Перейти к поиску
UML-диаграмма мультитона
UML-диаграмма мультитона

В программной инженерии , то многотонная модель представляет собой шаблон дизайна , который обобщает картину одноплодной . В то время как синглтон позволяет создать только один экземпляр класса, шаблон многотонности позволяет управляемое создание нескольких экземпляров, которыми он управляет с помощью карты .

Вместо того, чтобы иметь один экземпляр для каждого приложения (например, 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 ); }}

Ссылки [ править ]

Внешние ссылки [ править ]