všetky vzory

Abstract Factory

Vytvára celé rodiny súvisiacich objektov bez väzby na ich konkrétne triedy.

class GUIFactory {  createButton() { throw new Error('abstraktná metóda'); }  createCheckbox() { throw new Error('abstraktná metóda'); }  createMenu() { throw new Error('abstraktná metóda'); }} class WinFactory extends GUIFactory {  createButton() { return new WinButton(); }  createCheckbox() { return new WinCheckbox(); }  createMenu() { return new WinMenu(); }} class MacFactory extends GUIFactory {  createButton() { return new MacButton(); }  createCheckbox() { return new MacCheckbox(); }  createMenu() { return new MacMenu(); }} // factory je GUIFactory, konkrétnu triedu tu nikde nevidnofunction renderApp(factory) {  const button = factory.createButton();  const checkbox = factory.createCheckbox();  const menu = factory.createMenu();  return [button, checkbox, menu];} renderApp(new WinFactory());renderApp(new MacFactory());

Celý priebeh v texte (5 krokov)
  1. Obe fabriky dedia z GUIFactory. Klientský kód pozná len ju — konkrétnu triedu nikde nemenuje.
  2. Každý klient sa obráti na svoju fabriku.
  3. Fabrika nevydá jeden kus, ale celý zosúladený set — tri druhy widgetov v jednej rodine.
  4. Set putuje klientovi. Ten ich pozná len ako Button, Checkbox a Menu.
  5. Obaja klienti majú tie isté tri druhy. Líši sa len rodina — a pomiešať ju nemôžeš, o to sa stará fabrika.

Kedy použiť

  • Objekty patria do rodín a nesmú sa miešať — widgety jednej platformy, ovládače jednej databázy.
  • Celá rodina sa má vymeniť jedným riadkom, nie hľadaním všetkých new po kóde.
  • Variantov toho istého celku je viac a ďalšie sa majú dať doplniť zvonku.

Pasce

  • Pridávať varianty je lacné, pridávať druhy drahé.
  • Dva produkty a dve rodiny znamenajú päť tried navyše — bez výmeny variantov je to len réžia.
  • Zamieňa sa s Factory Method — tam jeden produkt dedením, tu celá rodina kompozíciou.
  • Konzistenciu rodiny nedrží typový systém, ale disciplína vnútri fabriky.