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, ktoré vyrábaš, patria do rodín a mieša ich nesmieš — widgety jednej platformy, ovládače jednej databázy, formáty jedného exportu.
  • Chceš celú rodinu vymeniť jedným riadkom, nie hľadaním všetkých new po kóde.
  • Máš viac variantov toho istého celku a pribúdajú ďalšie, ktoré chceš vedieť doplniť zvonku.

Pasce

  • Pridať nový druh produktu do rodiny znamená zasiahnuť do rozhrania fabriky a do každej jej implementácie. Pridávať varianty je lacné, pridávať druhy drahé.
  • Pri dvoch produktoch a dvoch rodinách je to päť tried navyše. Ak varianty nikdy nebudeš meniť, je to len réžia.
  • Ľahko sa zamení s Factory Method. Factory Method rieši jeden produkt dedením, Abstract Factory celú rodinu kompozíciou — fabriku dostaneš zvonku.
  • Konzistenciu rodiny nedrží typový systém, ale disciplína vnútri fabriky. Keď v jednej metóde vrátiš objekt z inej rodiny, nikto ťa nezastaví.