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ť

  • Konkrétne triedy nie sú vopred známe a musí byť kam ich doplniť.
  • Používateľ knižnice má môcť podsunúť vlastnú implementáciu bez zásahu do jej kódu.
  • Vytváranie objektu má vlastnú logiku a patrí do samostatnej triedy.

Pasce

  • Za každý produkt pribudne podtrieda creatora — pri troch je to šesť tried namiesto dvoch.
  • Rozhodovanie podľa parametra je statická factory, nie Factory Method.
  • Zamieňa sa s Abstract Factory — tá rieši rodiny kompozíciou, Factory Method jeden produkt dedením.
  • Podtrieda, ktorá je len obal nad jedným new, nepridáva nič — stačí podať objekt zvonku.