všetky vzory

Multiton

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

class Connection {  constructor(name) {    this.name = name;  }} class Connections {  static #byKey = new Map();   static forKey(key) {    if (!Connections.#byKey.has(key)) {      Connections.#byKey.set(key, new Connection(key));    }    return Connections.#byKey.get(key);  }} const inventory = Connections.forKey('inventory');const accounting = Connections.forKey('accounting');const report = Connections.forKey('inventory'); inventory === report;       // true — same key, same instanceinventory === accounting;   // false — different key, different instance

Celý priebeh v texte (11 krokov)
  1. Connections si nedržia jednu instanciu, ale množinu — na každý kľúč najviac jednu. Zatiaľ je prázdna.
  2. InventoryModule si vyžiada spojenie pre kľúč "inventory".
  3. Pod kľúčom "inventory" 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. AccountingModule žiada spojenie pre kľúč "accounting". Iný kľúč než predtým.
  6. Pod "accounting" 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 AccountingModule dostane referenciu — na svoju guličku, nie na tú prvú.
  8. A teraz to podstatné. ReportModule žiada spojenie — a žiada kľúč "inventory", ten istý, aký pýtal prvý modul.
  9. Pod kľúčom "inventory" už objekt je. Podmienka neplatí, žiadny new sa nespustí a v množine nepribudne nič.
  10. ReportModule dostane referenciu na tú istú guličku ako InventoryModule. 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ť

  • Spojenie na databázu, cache regiónu, konfigurácia klienta — na každý kľúč práve jedna.
  • Vytvorenie je drahé; kľúč povie, že ide o to isté, a druhýkrát sa už nič nevytvára.
  • Kto pozná kľúč, dostane to isté, čo ktokoľvek iný — aj keď o sebe navzájom nevedia.
  • Počet variantov nie je známy dopredu, pribúdajú za behu podľa toho, na čo sa niekto spýta.

Pasce

  • Singleton sľubuje jednu instanciu, Multiton jednu na kľúč — pri jedinom kľúči stačí Singleton.
  • Object Pool požičiava a berie späť; tu je väzba kľúč–instancia trvalá a nikto nič nevracia.
  • Kľúče zvonku množinu nafukujú — instancie pribúdajú a nemá ich kto zahodiť.
  • „Inventory" a „inventory" sú dva kľúče, takže vzniknú dve instancie tam, kde mala byť jedna.
  • Je to globálny stav rozdelený na priehradky: kto zapíše pod kľúč, mení ho všetkým.
  • Prvý žiadateľ rozhodne o parametroch; druhý dostane instanciu hotovú, aj keby ju chcel inak.
  • Medzi otázkou „je tam?" a zápisom je bez zámku medzera a jeden kľúč dostane dve instancie.