všetky vzory

Factory Method

Necháva podtriedy rozhodnúť, ktorý konkrétny objekt sa vytvorí.

class Exporter {  export(data) {    const doc = this.createDocument();    return doc.render(data);  }   createDocument() {    throw new Error('Podtrieda musí určiť dokument');  }} class PdfExporter extends Exporter {  createDocument() {    return new PdfDocument();  }} class CsvExporter extends Exporter {  createDocument() {    return new CsvDocument();  }} new PdfExporter().export(rows);new CsvExporter().export(rows);

Celý priebeh v texte (8 krokov)
  1. Exporter je abstraktný. Postup má napísaný, ale jednu metódu nechal nedokončenú — tú, ktorá rozhoduje, čo vytvoriť.
  2. Client zavolá export() na PdfExporter. Nevie a nemusí vedieť, aký objekt vnútri vznikne.
  3. Factory method v PdfExporter rozhodla: vzniká PdfDocument.
  4. Kód v Exporter.export() s ním pracuje len ako s Document — konkrétnu triedu nikde nemenuje.
  5. To isté volanie, iný creator.
  6. Tá istá metóda, iná podtrieda — a vzniká CsvDocument. Iný tvar, iná trieda.
  7. Client dostane druhý typ, ale zaobchádza s ním presne rovnako.
  8. Kód clienta sa nezmenil ani o znak. Menila sa len trieda, ktorá rozhodla, čo vytvoriť.

Kedy použiť

  • Vopred nevieš, s akými konkrétnymi triedami bude tvoj kód pracovať — a chceš mať kam ich doplniť.
  • Chceš dať používateľom knižnice možnosť podsunúť vlastnú implementáciu bez zásahu do tvojho kódu.
  • Vytváranie objektu má vlastnú logiku, ktorú chceš delegovať a izolovať do samostatnej triedy.

Pasce

  • Za každý nový produkt pribudne aj nová podtrieda creatora. Pri troch produktoch to je šesť tried namiesto dvoch.
  • Ak sa rozhoduje podľa parametra a nie dedením, nie je to Factory Method — je to obyčajná statická factory. To je v poriadku, len to tak nenazývaj.
  • Ľahko sa zamení s Abstract Factory. Factory Method vytvára jeden produkt a rieši ho dedením, Abstract Factory vytvára celé rodiny produktov a rieši ich kompozíciou.
  • Keď je podtrieda creatora len obal nad jedným `new`, vzor pravdepodobne nič nepridáva a stačí podať hotový objekt zvonku.