Abstraktné továrenské vzory v Jave

1. Prehľad

V tomto článku rozoberieme návrhový vzor Abstract Factory.

Kniha Design Patterns: Elements of Reusable Object-Oriented Software uvádza, že abstraktná továreň „Poskytuje rozhranie na vytváranie skupín príbuzných alebo závislých objektov bez určenia ich konkrétnych tried“. Inými slovami, tento model nám umožňuje vytvárať objekty, ktoré sa riadia všeobecným vzorom.

Príkladom návrhového vzoru Abstract Factory v JDK je newInstance () z javax.xml.parsers.DocumentBuilderFactory trieda.

2. Príklad abstraktného továrenského dizajnu

V tomto príklade vytvoríme dve implementácie vzoru Factory Method Design: AnimalFactory a FarbaTováreň.

Potom k nim budeme spravovať prístup pomocou Abstraktnej továrne AbstractFactory:

Najskôr vytvoríme rodinu Zviera triedy a neskôr ju použijeme v našej Abstraktnej továrni.

Tu je Zviera rozhranie:

verejné rozhranie Animal {String getAnimal (); Reťazec makeSound (); }

a konkrétna implementácia Kačica:

public class Duck implements Animal {@Override public String getAnimal () {return "Duck"; } @Override public String makeSound () {return "Squeks"; }} 

Ďalej môžeme vytvoriť konkrétnejšie implementácie Zviera rozhranie (ako Pes, medveď, atď.) presne týmto spôsobom.

Abstraktná továreň sa zaoberá rodinami závislých objektov. S ohľadom na to predstavíme ešte jednu rodinu Farba ako rozhranie s niekoľkými implementáciami (Biela, hnedá, ...).

Aktuálny kód zatiaľ preskočíme, ale nájdete ho tu.

Teraz, keď máme pripravených viac rodín, môžeme vytvoriť AbstractFactory rozhranie pre nich:

verejné rozhranie AbstractFactory {T create (String animalType); }

Ďalej implementujeme AnimalFactory pomocou návrhového vzoru Factory Method, o ktorom sme hovorili v predchádzajúcej časti:

verejná trieda AnimalFactory implementuje AbstractFactory {@Override public Animal create (String animalType) {if ("Dog" .equalsIgnoreCase (animalType)) {return new Dog (); } else if ("Duck" .equalsIgnoreCase (animalType)) {return new Duck (); } return null; }} 

Podobne môžeme realizovať továreň na Farba s rovnakým dizajnovým vzorom.

Keď je toto všetko nastavené, vytvoríme FactoryProvider triedy, ktorá nám zabezpečí implementáciu AnimalFactory alebo ColorFactory v závislosti od argumentu, ktorý dodávame getFactory () metóda:

verejná trieda FactoryProvider {public static AbstractFactory getFactory (voľba reťazca) {if ("Animal" .equalsIgnoreCase (výber)) {vrátiť nové AnimalFactory (); } else if ("Color" .equalsIgnoreCase (choice)) {return new ColorFactory (); } return null; }}

3. Kedy použiť abstraktný továrenský vzor:

  • Klient je nezávislý na tom, ako vytvárame a skladáme objekty v systéme
  • Systém sa skladá z viacerých skupín objektov a tieto skupiny sú určené na spoločné použitie
  • Potrebujeme hodnotu run-time, aby sme vytvorili konkrétnu závislosť

Aj keď je vzor pri vytváraní preddefinovaných objektov vynikajúci, pridanie nových môže byť náročné. Na podporu nového typu objektov bude potrebné zmeniť AbstractFactory triedy a všetkých jej podtried.

4. Zhrnutie

V tomto článku sme sa dozvedeli o dizajnovom vzore Abstract Factory.

Nakoniec, ako vždy, implementáciu týchto príkladov nájdete na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found