všetky vzory

Multiton

Drží pomenovanú množinu instancií — na každý kľúč najviac jednu.

class Spojenie {  constructor(nazov) {    this.nazov = nazov;  }} class Spojenia {  static #podlaKluca = new Map();   static pre(kluc) {    if (!Spojenia.#podlaKluca.has(kluc)) {      Spojenia.#podlaKluca.set(kluc, new Spojenie(kluc));    }    return Spojenia.#podlaKluca.get(kluc);  }} const sklad = Spojenia.pre('sklad');const ucto = Spojenia.pre('ucto');const report = Spojenia.pre('sklad'); sklad === report;   // true — ten istý kľúč, tá istá instanciasklad === ucto;     // false — iný kľúč, iná instancia

Celý priebeh v texte (11 krokov)
  1. Spojenia si nedržia jednu instanciu, ale množinu — na každý kľúč najviac jednu. Zatiaľ je prázdna.
  2. SkladovyModul si vyžiada spojenie pre kľúč "sklad".
  3. Pod kľúčom "sklad" zatiaľ nič nie je, takže objekt práve teraz vzniká — a uloží sa pod ten kľúč.
  4. Von neputuje objekt, ale referencia naň. Lanko drží, kam ukazuje.
  5. UctovnyModul žiada spojenie pre kľúč "ucto". Iný kľúč než predtým.
  6. Pod "ucto" tiež nič nie je, takže vzniká druhá instancia. Rovnaký tvar, lebo je to tá istá trieda — iná farba, lebo je to iný kľúč.
  7. Aj UctovnyModul dostane referenciu — na svoju guličku, nie na tú prvú.
  8. A teraz to podstatné. ReportModul žiada spojenie — a žiada kľúč "sklad", ten istý, aký pýtal prvý modul.
  9. Pod kľúčom "sklad" už objekt je. Podmienka neplatí, žiadny new sa nespustí a v množine nepribudne nič.
  10. ReportModul dostane referenciu na tú istú guličku ako SkladovyModul. Dve lanká, jeden objekt.
  11. Tri moduly, dva kľúče, dve guličky. Nie jedna ako pri Singletone a nie tri ako bez vzoru — koľko ich bude, rozhoduje kľúč. Tretí slot zostal prázdny a čaká na kľúč, ktorý zatiaľ nikto nepýtal.

Kedy použiť

  • Zdroj sa prirodzene delí na pomenované varianty a každý z nich má byť v aplikácii jeden. Spojenie na databázu, cache regiónu, konfigurácia klienta — na kľúč práve jedna.
  • Vytvorenie je drahé a opakuje sa s tými istými parametrami. Kľúč povie, že ide o to isté, a druhýkrát sa už nič nevytvára.
  • Instancie sa musia dať nájsť podľa mena z viacerých miest, ktoré o sebe nevedia. Kto pozná kľúč, dostane presne to, čo dostal ktokoľvek iný s tým istým kľúčom.
  • Počet variantov nie je známy dopredu. Singleton by vyžadoval jednu triedu na každý z nich; tu pribúdajú za behu podľa toho, na čo sa niekto spýta.

Pasce

  • Zamieňa sa so Singletonom. Singleton hovorí „práve jedna instancia", Multiton „na každý kľúč najviac jedna". Keď je kľúč jediný a nikdy nepribudne druhý, nepotrebujete Multiton, ale Singleton.
  • Zamieňa sa s Object Poolom. Pool požičiava a berie objekty späť, takže ten istý žiadateľ dostane raz jeden a raz druhý. Tu je väzba kľúč–instancia trvalá a nikto nič nevracia.
  • Množina rastie a nič ju nezmenšuje. Keď kľúče prichádzajú zvonku — od používateľa, z požiadavky, z názvu súboru — pribúdajú instancie, ktoré už nikto nepoužije, a nemá ich kto zahodiť.
  • Kľúč, ktorý sa dá napísať dvoma spôsobmi, rozbije celý vzor. „Sklad" a „sklad" sú pre mapu dva kľúče, takže vzniknú dve instancie tam, kde mala byť jedna — a chyba sa prejaví až v dôsledkoch.
  • Zdedí všetky problémy globálneho stavu, len ich rozdelí na priehradky. Kto zapíše do spojenia pod jedným kľúčom, mení ho všetkým ostatným držiteľom toho kľúča.
  • Prvý žiadateľ rozhodne o parametroch pre všetkých. Instancia sa vytvorí podľa toho, kto prišiel prvý; druhý ju dostane hotovú, aj keby ju chcel inak nastavenú.
  • Súbežný prístup vyrobí dve instancie na jeden kľúč. Medzi otázkou „je tam?" a zápisom je medzera a bez zámku ňou prejdú dvaja naraz — a vzor sľubuje, že to nikdy nenastane.