všetky vzory

Simple Factory Method

Skryje voľbu konkrétnej triedy do jedinej vytváracej metódy.

class Transport {  deliver(shipment) { throw new Error('abstraktná metóda'); }} class Truck extends Transport {  deliver(shipment) {    // by road  }} class Ship extends Transport {  deliver(shipment) {    // by sea  }} class Drone extends Transport {  deliver(shipment) {    // by air  }} // The only place in the application that names the concrete classes.class TransportFactory {  static forRoute(route) {    if (route === 'road') return new Truck();    if (route === 'sea') return new Ship();    if (route === 'air') return new Drone();    throw new Error('unknown route: ' + route);  }} const a = TransportFactory.forRoute('road');const b = TransportFactory.forRoute('sea');const c = TransportFactory.forRoute('air'); a.deliver(shipment);   // the client wrote no new at all

Celý priebeh v texte (12 krokov)
  1. Transport je abstraktný a všetky tri konkrétne triedy ho dedia. Klient bude poznať len jeho — kamión, loď ani dron nenapíše ani raz.
  2. Fabrika je jediné miesto, kde tie tri mená vôbec zaznejú. Nie je to hierarchia tried, je to jedna metóda s rozhodovaním vnútri.
  3. Klient si vypýta dopravu pre trasu "cesta". Posiela parameter, nie názov triedy.
  4. Fabrika sa rozhodla a vzniká Truck.
  5. Von ide ako Transport. Klient si ho odloží a s konkrétnym typom nemá čo do činenia.
  6. Druhá žiadosť, tá istá metóda a tá istá dráha — len parameter je "more".
  7. A z tej istej komory vyjde iný typ: Ship. Iný tvar, iná trieda.
  8. Klient ho prevezme presne tak isto ako kamión.
  9. Tretia žiadosť s parametrom "vzduch".
  10. Tretí typ z tej istej metódy: Drone.
  11. Aj ten putuje klientovi ako Transport.
  12. Tri rôzne triedy vyšli z jednej metódy a po jednej dráhe. Klient nenapísal ani jeden new a o kamióne sa nikdy nedozvedel — celé rozhodovanie ostalo na jednom mieste. Že je to jedno miesto, je zároveň najväčšia slabina vzoru: každý nový typ znamená zásah práve doň.

Kedy použiť

  • Voľba konkrétnej triedy sa opakuje na viacerých miestach a fabrika ju zoberie na seba.
  • Vytvorenie je zložitejšie než jedno new — závislosti, nastavenie, voľba podľa vstupu.
  • Klient dostane Dopravu a je mu jedno, či je to kamión alebo dron, pokiaľ vie doručiť.
  • Nová trieda znamená jeden riadok vo fabrike a nič inde.
  • Typ určuje až parameter, konfigurácia alebo odpoveď servera; statické new sa napísať nedá.

Pasce

  • Zamieňa sa s Factory Method z GoF: tam rozhoduje podtrieda, tu jedna metóda podľa parametra.
  • Každý nový typ znamená zásah do tej istej metódy; vzor zmenu sústredí, nezruší.
  • Podmienka rastie: desať typov je desať vetiev v jednej metóde.
  • Fabrika, ktorá pri neznámom kľúči ticho vráti nič, presunie chybu ďaleko od príčiny.
  • Fabrika sa stane skladiskom, keď do nej pribudne nastavenie, prihlasovanie aj cache.
  • Reťazec „kamion" názov triedy neodstránil, len ho premenil na text, ktorý nikto nekontroluje.