všetky vzory

Singleton

Zaručí, že trieda má najviac jednu instanciu, a dá k nej globálny prístup.

class Config {  static #instance = null;   static getInstance() {    if (Config.#instance === null) {      Config.#instance = new Config();    }    return Config.#instance;  }} const a = Config.getInstance();const b = Config.getInstance();console.log(a === b); // true

Celý priebeh v texte (10 krokov)
  1. Config má v statickom kontexte miesto pre jedinú instanciu. Zatiaľ je prázdne.
  2. ClientA si prvýkrát vyžiada instanciu cez getInstance().
  3. Pole je null, takže objekt práve teraz vzniká — priamo v triede. Jediný raz za život programu.
  4. Von neputuje objekt, ale referencia na neho. Lanko drží, kam ukazuje.
  5. ClientB žiada to isté.
  6. Pole už nie je null. Podmienka neplatí, žiadny new sa nespustí — v statickom poli zostáva tá istá gulička.
  7. ClientB dostane referenciu na tú istú guličku.
  8. ClientC žiada instanciu.
  9. Tretia referencia. Objekt je stále jeden.
  10. Jedna gulička v statickom poli, tri lanká do nej. Presne preto platí a === b === c.

Kedy použiť

  • Objekt drží stav, ktorý musí byť v celej aplikácii rovnaký — konfigurácia, cache, pool spojení.
  • Vytvorenie objektu je drahé a nemá zmysel ho robiť opakovane.
  • Potrebuješ prísne kontrolovať, kto a kedy objekt vytvorí.

Pasce

  • Skryje závislosť. Trieda, ktorá si Singleton zavolá vnútri, o ňom v konštruktore nič nepovie — a testy to odhalia až keď zlyhajú.
  • Zdieľaný mutovateľný stav je globálna premenná v obleku. Čím viac miest doň zapisuje, tým horšie sa hľadá príčina chyby.
  • Ťažko sa testuje. Instancia žije medzi testami, takže poradie testov začne mať vplyv na výsledok.
  • Vo viacvláknovom prostredí je naivná kontrola na null súbeh. V JavaScripte to nehrozí, v Jave alebo C# áno.