všetky vzory

Object Pool

Požičiava drahé objekty zo zásoby a po použití ich berie späť.

class Connection {  execute(query) {    // work over an expensive resource  }} class ConnectionPool {  #free = [];  #borrowed = new Set();   constructor(count) {    for (let i = 0; i < count; i += 1) {      this.#free.push(new Connection());    }  }   acquire() {    if (this.#free.length === 0) {      throw new Error('pool is empty');    }    const connection = this.#free.pop();    this.#borrowed.add(connection);    return connection;  }   release(connection) {    this.#borrowed.delete(connection);    this.#free.push(connection);  }} const pool = new ConnectionPool(3); const a = pool.acquire();const b = pool.acquire(); pool.release(a);const c = pool.acquire(); a === c;   // true — the pool handed out the same object again

Celý priebeh v texte (11 krokov)
  1. Pool si spojenia vyrobí dopredu, ešte kým o ne niekto požiada. Práve preto vzor existuje: vznik je drahý a má sa zaplatiť raz.
  2. TaskA si vypýta spojenie. Nepýta si konkrétne — chce ktorékoľvek voľné.
  3. Pool jedno vydá a vyškrtne si ho z voľných. Objekt neputuje ako kópia, odchádza ten istý — v poole po ňom zostalo prázdne miesto.
  4. TaskB žiada tiež.
  5. Dostane druhé v poradí. Ktoré presne, jej je jedno — objekty sú zameniteľné.
  6. Voľné zostalo jediné. Toto je druhá polovica vzoru: pool vie, koľko ich je vonku, a keď dôjdu, ďalší žiadateľ počká — nové sa nevyrobí.
  7. TaskA dorobila svoju prácu a spojenie vracia. Nezahadzuje ho — posiela ho späť tam, odkiaľ si ho požičala.
  8. A je späť vo svojom mieste. Tá istá gulička, akú si TaskA pred chvíľou odniesla — nič nevzniklo a nič nezaniklo.
  9. TaskA potrebuje spojenie znovu.
  10. A dostane presne tú istú guličku, ktorú predtým vrátila. Druhýkrát sa za jej vytvorenie neplatilo nič.
  11. Tri žiadosti, tri objekty — a všetky tri vznikli na začiatku. Vzor nešetrí na tom, koľko objektov je, ale na tom, koľkokrát vznikajú.

Kedy použiť

  • Spojenie do databázy, vlákno, soket — vznik sa zaplatí raz a potom sa objekt už len požičiava.
  • Zdroj je vyčerpateľný a pool je jediné miesto, ktoré vie, koľko ich je vonku.
  • Žiadateľovi je jedno, ktorý objekt dostane — inak potrebuje register podľa kľúča, nie pool.
  • Vytváranie a rušenie beží v krátkych cykloch a cena za vznik sa nasčíta.

Pasce

  • Vrátený objekt si nesie starý stav: ďalší zdedí rozrobenú transakciu alebo cudzie dáta.
  • Kto si objekt požičia a nevráti ho, pool vyhladoví — a prejaví sa to až o hodinu.
  • Objekt použitý po vrátení už patrí inému a dvaja píšu do toho istého zdroja.
  • Multiton drží väzbu na kľúč trvalo, pool požičia čokoľvek voľné — na konkrétnu instanciu sa nehodí.
  • Pri lacnom objekte je réžia požičiavania drahšia než obyčajné vytvorenie.
  • Veľkosť poolu je hádanie: primalý znamená čakanie, priveľký drží nepoužívané zdroje.