В розробці програмного забезпечення, шаблон проєктування мультитон або пул одинаків схожий на шаблон одинак, який дозволяє створювати лише один екземпляр об’єкта, але розширює його можливістю впорядковувати декілька екземплярів у вигляді іменованих пар ім'я-значення.
Замість того, щоб забезпечувати наявність лише одного об'єкта в програмі, мультитон гарантує існування лише одного входження з відповідним ключем.
Застосування
Мультитон можна використовувати в випадку, коли необхідно забезпечити доступ до конкретного набору даних із різних місць програми. Інший випадок - взаємодія з апаратним обладнанням через екземпляри одного і того самого класу. Наприклад, обмін даними з мережею контролерів, опитування серверів або робочих станцій в мережі. Всі ці приклади об'єднує одне: кількість екземплярів може бути обмежена (і навіть повинна бути обмежена) і вони глобальні для всієї програми.
Даний шаблон можна розглядати навіть як об'єднання ідеї шаблону одинака і пулу об'єктів. Виходячи з цього можна визначити його властивості:
- Шаблон можна застосовувати як із заздалегідь визначеним списком екземплярів, так і створеним динамічно.
- Якщо список фіксований, то можливо створити всі екземпляри при старті програми або при зверненні до будь-якого з них.
- Можливо два варіанти поведінки у відповідь на запит екземпляра з невідомим ідентифікатором: відмова або його створення.
- Недоліком шаблона, є можливість появи великої кількості залежних від нього частин програми. Однак, у випадку з одинаком, це можна вирішити шляхом використання методу впровадження залежностей.
Порівняння з іншими подібними шаблонами проєктування:
Мультитон | Шаблон одинак | Пул об'єктів |
---|---|---|
Створює і зберігає задану кількість екземплярів свого класу. Забезпечує їх ідентифікацію і доступність по всій програмі. | Створює єдиний екземпляр свого класу і забезпечує доступ до нього для всієї програми. | Створює і зберігає визначене число екземплярів заданого класу, але нічого не знає про їх суть. |
Контролює кількість екземплярів | Гарантує існування одного екземпляра | Не обмежує створення інших екземплярів заданого класу поза шаблоном і нічого не знає про їх існування. |
Приклади
C#
using System.Collections.Generic; using System.Collections.Concurrent; namespace MyApplication { public class Multiton<T> // generic multition. { private static readonly ConcurrentDictionary<object, T> _instances = new ConcurrentDictionary<object, T>(); private Multiton() { } public static T GetInstance(object key) { return _instances.GetOrAdd(key, (k) => new Multiton()); } } }
C++
Реалізація взята з StackOverflow [ 27 серпня 2014 у Wayback Machine.]
#ifndef MULTITON_H #define MULTITON_H #include <map> #include <string> template <typename T, typename Key = std::string> class Multiton { public: static void destroy() { for (typename std::map<Key, T*>::const_iterator it = instances.begin(); it != instances.end(); ++it) delete (*it).second; instances.clear(); } static T* getPtr(const Key& key) { typename std::map<Key, T*>::const_iterator it = instances.find(key); if (it != instances.end()) { return (T*)(it->second); } T* instance = new T(); instances[key] = instance; return instance; } static T& getRef(const Key& key) { return *getPtr(key); } protected: Multiton() {} ~Multiton() {} private: Multiton(const Multiton&) {} Multiton& operator= (const Multiton&) { return *this; } static std::map<Key, T*> instances; }; template <typename T, typename Key> std::map<Key, T*> Multiton<T, Key>::instances; #endif // приклад використання class Foo : public Multiton<Foo> {}; Foo& foo1 = Foo::getRef("foobar"); Foo* foo2 = Foo::getPtr("foobar"); Foo::destroy();
Примітки
- . Архів оригіналу за 29 липня 2014. Процитовано 24 липня 2014.
Література
Алан Шаллоуей, Джеймс Р. Тротт. Шаблоны проектирования. Новый подход к объектно-ориентированному анализу и проектированию = Design Patterns Explained: A New Perspective on Object-Oriented Design. — М. : «Вильямс», 2002. — 288 с. — .
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
V rozrobci programnogo zabezpechennya shablon proyektuvannya multiton abo pul odinakiv shozhij na shablon odinak yakij dozvolyaye stvoryuvati lishe odin ekzemplyar ob yekta ale rozshiryuye jogo mozhlivistyu vporyadkovuvati dekilka ekzemplyariv u viglyadi imenovanih par im ya znachennya UML diagrama dlya multitonu Zamist togo shob zabezpechuvati nayavnist lishe odnogo ob yekta v programi multiton garantuye isnuvannya lishe odnogo vhodzhennya z vidpovidnim klyuchem ZastosuvannyaMultiton mozhna vikoristovuvati v vipadku koli neobhidno zabezpechiti dostup do konkretnogo naboru danih iz riznih misc programi Inshij vipadok vzayemodiya z aparatnim obladnannyam cherez ekzemplyari odnogo i togo samogo klasu Napriklad obmin danimi z merezheyu kontroleriv opituvannya serveriv abo robochih stancij v merezhi Vsi ci prikladi ob yednuye odne kilkist ekzemplyariv mozhe buti obmezhena i navit povinna buti obmezhena i voni globalni dlya vsiyeyi programi Danij shablon mozhna rozglyadati navit yak ob yednannya ideyi shablonu odinaka i pulu ob yektiv Vihodyachi z cogo mozhna viznachiti jogo vlastivosti Shablon mozhna zastosovuvati yak iz zazdalegid viznachenim spiskom ekzemplyariv tak i stvorenim dinamichno Yaksho spisok fiksovanij to mozhlivo stvoriti vsi ekzemplyari pri starti programi abo pri zvernenni do bud yakogo z nih Mozhlivo dva varianti povedinki u vidpovid na zapit ekzemplyara z nevidomim identifikatorom vidmova abo jogo stvorennya Nedolikom shablona ye mozhlivist poyavi velikoyi kilkosti zalezhnih vid nogo chastin programi Odnak u vipadku z odinakom ce mozhna virishiti shlyahom vikoristannya metodu vprovadzhennya zalezhnostej Porivnyannya z inshimi podibnimi shablonami proyektuvannya Multiton Shablon odinak Pul ob yektiv Stvoryuye i zberigaye zadanu kilkist ekzemplyariv svogo klasu Zabezpechuye yih identifikaciyu i dostupnist po vsij programi Stvoryuye yedinij ekzemplyar svogo klasu i zabezpechuye dostup do nogo dlya vsiyeyi programi Stvoryuye i zberigaye viznachene chislo ekzemplyariv zadanogo klasu ale nichogo ne znaye pro yih sut Kontrolyuye kilkist ekzemplyariv Garantuye isnuvannya odnogo ekzemplyara Ne obmezhuye stvorennya inshih ekzemplyariv zadanogo klasu poza shablonom i nichogo ne znaye pro yih isnuvannya PrikladiC using System Collections Generic using System Collections Concurrent namespace MyApplication public class Multiton lt T gt generic multition private static readonly ConcurrentDictionary lt object T gt instances new ConcurrentDictionary lt object T gt private Multiton public static T GetInstance object key return instances GetOrAdd key k gt new Multiton C Realizaciya vzyata z StackOverflow 27 serpnya 2014 u Wayback Machine ifndef MULTITON H define MULTITON H include lt map gt include lt string gt template lt typename T typename Key std string gt class Multiton public static void destroy for typename std map lt Key T gt const iterator it instances begin it instances end it delete it second instances clear static T getPtr const Key amp key typename std map lt Key T gt const iterator it instances find key if it instances end return T it gt second T instance new T instances key instance return instance static T amp getRef const Key amp key return getPtr key protected Multiton Multiton private Multiton const Multiton amp Multiton amp operator const Multiton amp return this static std map lt Key T gt instances template lt typename T typename Key gt std map lt Key T gt Multiton lt T Key gt instances endif priklad vikoristannya class Foo public Multiton lt Foo gt Foo amp foo1 Foo getRef foobar Foo foo2 Foo getPtr foobar Foo destroy Primitki Arhiv originalu za 29 lipnya 2014 Procitovano 24 lipnya 2014 LiteraturaAlan Shallouej Dzhejms R Trott Shablony proektirovaniya Novyj podhod k obektno orientirovannomu analizu i proektirovaniyu Design Patterns Explained A New Perspective on Object Oriented Design M Vilyams 2002 288 s ISBN 0 201 71594 5