logo

Továrenská metóda Návrhový vzor

Návrhový vzor továrenskej metódy je a kreatívny dizajnový vzor ktorý poskytuje rozhranie na vytváranie objektov v nadtriede, čo umožňuje podtriedam meniť typ objektov, ktoré budú vytvorené. Zapuzdruje logiku vytvárania objektov do samostatnej metódy, čím podporuje voľné spojenie medzi tvorcom a vytvorenými objektmi. Tento vzor je obzvlášť užitočný, keď sa presné typy objektov, ktoré sa majú vytvoriť, môžu líšiť alebo je potrebné ich určiť za behu, čo umožňuje flexibilitu a rozšíriteľnosť pri vytváraní objektov.

Obsah



Aký je návrhový vzor továrenskej metódy?

Návrhový vzor továrenskej metódy je tvorivý návrhový vzor používaný v softvérovom inžinierstve na poskytovanie rozhrania na vytváranie objektov v nadtriede, pričom umožňuje podtriedam meniť typ objektov, ktoré budú vytvorené. Zapuzdruje logiku tvorby objektu do samostatnej metódy, abstrahuje proces vytvárania inštancií a podporuje voľné prepojenie medzi tvorcom a vytvorenými objektmi. Tento vzor umožňuje flexibilitu, rozšíriteľnosť a udržiavateľnosť v kódovej základni tým, že umožňuje podtriedam definovať vlastnú implementáciu továrenskej metódy na vytváranie špecifických typov objektov.

0,06 ako zlomok

Kedy použiť návrhový vzor továrenskej metódy?

Použiť návrhový vzor továrenskej metódy:

  • Keď chcete zapuzdrenie vytvárania objektu: Ak máte zložitý proces vytvárania objektov alebo ak sa proces môže líšiť v závislosti od podmienok, zapuzdrenie tejto logiky do továrenskej metódy môže zjednodušiť klientsky kód a podporiť opätovnú použiteľnosť.
  • Keď chcete oddeliť klientsky kód od konkrétnych tried: Použitie vzoru Factory Method Pattern vám umožňuje vytvárať objekty cez rozhranie alebo abstraktnú triedu abstrahovaním špecifických implementačných detailov konkrétnych tried z klientskeho kódu. To podporuje voľné prepojenie a uľahčuje úpravu alebo rozšírenie systému bez ovplyvnenia existujúceho kódu klienta.
  • Keď potrebujete podporovať viacero variácií produktov: Ak vaša aplikácia potrebuje vytvoriť rôzne variácie produktu alebo ak v budúcnosti môžu byť zavedené nové typy produktov, vzor výrobných metód poskytuje flexibilný spôsob prispôsobenia sa týmto variáciám definovaním výrobných metód pre každý typ produktu.
  • Ak chcete podporiť prispôsobenie alebo konfiguráciu: Továrne možno použiť na zapuzdrenie logiky konfigurácie, čo umožňuje klientom prispôsobiť proces vytvárania poskytnutím parametrov alebo možností konfigurácie továrenskej metóde.

Komponenty návrhového vzoru továrenskej metódy

1. Tvorca

Toto je abstraktná trieda alebo rozhranie, ktoré deklaruje továrenskú metódu. Tvorca zvyčajne obsahuje metódu, ktorá slúži ako továreň na vytváranie objektov. Môže obsahovať aj iné metódy, ktoré pracujú s vytvorenými objektmi.

ak inak slučka v jave

2. Tvorca betónu

Triedy Concrete Creator sú podtriedy Creator, ktoré implementujú továrenskú metódu na vytváranie špecifických typov objektov. Každý tvorca betónu je zodpovedný za vytvorenie konkrétneho produktu.

3. Produkt

Toto je rozhranie alebo abstraktná trieda pre objekty, ktoré vytvára továrenská metóda. Produkt definuje spoločné rozhranie pre všetky objekty, ktoré môže továrenská metóda vytvoriť.

4. Betónový výrobok

Triedy konkrétneho produktu sú skutočné objekty, ktoré továrenská metóda vytvára. Každá trieda konkrétneho produktu implementuje rozhranie produktu alebo rozširuje abstraktnú triedu produktu.

Príklad vzoru návrhu továrenskej metódy

Nižšie je uvedené vyhlásenie o probléme na pochopenie vzoru návrhu továrenskej metódy:

Zvážte softvérovú aplikáciu, ktorá potrebuje zvládnuť vytváranie rôznych typov vozidiel, ako sú dvojkolky, trojkolky a štvorkolky. Každý typ vozidla má svoje špecifické vlastnosti a správanie.

1. Bez návrhového vzoru továrenskej metódy

Java
/*package whatever //do not write package name here */ import java.io.*; // Library classes abstract class Vehicle {  public abstract void printVehicle(); } class TwoWheeler extends Vehicle {  public void printVehicle() {  System.out.println('I am two wheeler');  } } class FourWheeler extends Vehicle {  public void printVehicle() {  System.out.println('I am four wheeler');  } } // Client (or user) class class Client {  private Vehicle pVehicle;  public Client(int type) {  if (type == 1) {  pVehicle = new TwoWheeler();  } else if (type == 2) {  pVehicle = new FourWheeler();  } else {  pVehicle = null;  }  }  public void cleanup() {  if (pVehicle != null) {  pVehicle = null;  }  }  public Vehicle getVehicle() {  return pVehicle;  } } // Driver program public class GFG {  public static void main(String[] args) {  Client pClient = new Client(1);  Vehicle pVehicle = pClient.getVehicle();  if (pVehicle != null) {  pVehicle.printVehicle();  }  pClient.cleanup();  } }>
Výkon
I am two wheeler>

Aké sú problémy s vyššie uvedeným dizajnom?

Vo vyššie uvedenom dizajne kódu:

  • Tesné spojenie: Trieda klientovClient>priamo vytvára inštancie konkrétnych tried (TwoWheeler>aFourWheeler>) na základe typu vstupu poskytnutého počas jeho konštrukcie. To vedie k úzkemu spojeniu medzi klientom a konkrétnymi triedami, čo sťažuje údržbu a rozšírenie kódu.
  • Porušenie princípu jednotnej zodpovednosti (SRP): TheClient>trieda je zodpovedná nielen za určenie, ktorý typ vozidla sa má vytvoriť na základe typu vstupu, ale aj za riadenie životného cyklu objektu vozidla (napr. čistenie). To porušuje princíp jednotnej zodpovednosti, ktorý hovorí, že trieda by mala mať len jeden dôvod na zmenu.
  • Obmedzená škálovateľnosť: Pridanie nového typu vozidla vyžaduje úpravuClient>triedy, ktorá porušuje princíp otvorený-zatvorený. Tento dizajn nie je škálovateľný, pretože sa nemôže prispôsobiť novým typom vozidiel bez úpravy existujúceho kódu.

Ako sa vyhneme problémom?

  • Definujte továrenské rozhranie: VytvorVehicleFactory>rozhranie alebo abstraktná trieda s metódou na vytváranie vozidiel.
  • Implementovať továrne na betón: Implementujte betónové výrobné triedy (TwoWheelerFactory>aFourWheelerFactory>), ktoré implementujúVehicleFactory>rozhranie a poskytujú metódy na vytváranie inštancií špecifických typov vozidiel.
  • Refaktorový klient: UpravteClient>triedy prijať aVehicleFactory>namiesto priameho vytvárania inštancií vozidiel. Klient si vyžiada vozidlo z výroby, čím sa eliminuje potreba podmienenej logiky založenej na typoch vozidiel.
  • Vylepšená flexibilita: S týmto prístupom je pridávanie nových typov vozidiel také jednoduché, ako vytvorenie novej výrobnej triedy pre nový typ vozidla bez úpravy existujúceho kódu klienta.

2. S návrhovým vzorom továrenskej metódy

Rozdeľme kód na kód po komponentoch:

FactoryMethodDesignPattern

1. Rozhranie produktu

Java
// Product interface representing a vehicle public abstract class Vehicle {  public abstract void printVehicle(); }>

2. Betónové výrobky

Java
// Concrete product classes representing different types of vehicles public class TwoWheeler extends Vehicle {  public void printVehicle() {  System.out.println('I am two wheeler');  } } public class FourWheeler extends Vehicle {  public void printVehicle() {  System.out.println('I am four wheeler');  } }>

3. Rozhranie pre tvorcov (rozhranie z výroby)

Java
// Factory interface defining the factory method public interface VehicleFactory {  Vehicle createVehicle(); }>

4. Tvorcovia betónu (fabriky na betón)

Java
// Concrete factory class for TwoWheeler public class TwoWheelerFactory implements VehicleFactory {  public Vehicle createVehicle() {  return new TwoWheeler();  } } // Concrete factory class for FourWheeler public class FourWheelerFactory implements VehicleFactory {  public Vehicle createVehicle() {  return new FourWheeler();  } }>

Kompletný kód tohto príkladu:

Java
// Library classes abstract class Vehicle {  public abstract void printVehicle(); } class TwoWheeler extends Vehicle {  public void printVehicle() {  System.out.println('I am two wheeler');  } } class FourWheeler extends Vehicle {  public void printVehicle() {  System.out.println('I am four wheeler');  } } // Factory Interface interface VehicleFactory {  Vehicle createVehicle(); } // Concrete Factory for TwoWheeler class TwoWheelerFactory implements VehicleFactory {  public Vehicle createVehicle() {  return new TwoWheeler();  } } // Concrete Factory for FourWheeler class FourWheelerFactory implements VehicleFactory {  public Vehicle createVehicle() {  return new FourWheeler();  } } // Client class class Client {  private Vehicle pVehicle;  public Client(VehicleFactory factory) {  pVehicle = factory.createVehicle();  }  public Vehicle getVehicle() {  return pVehicle;  } } // Driver program public class GFG {  public static void main(String[] args) {  VehicleFactory twoWheelerFactory = new TwoWheelerFactory();  Client twoWheelerClient = new Client(twoWheelerFactory);  Vehicle twoWheeler = twoWheelerClient.getVehicle();  twoWheeler.printVehicle();  VehicleFactory fourWheelerFactory = new FourWheelerFactory();  Client fourWheelerClient = new Client(fourWheelerFactory);  Vehicle fourWheeler = fourWheelerClient.getVehicle();  fourWheeler.printVehicle();  } }>
Výkon
I am two wheeler I am four wheeler>

Vo vyššie uvedenom kóde:

char a int java
  • Vehicle> slúži ako produktové rozhranie, ktoré definuje spoločnú metódu printVehicle()> že všetky betónové výrobky musia implementovať.
  • TwoWheeler> a FourWheeler> sú konkrétne triedy produktov reprezentujúce rôzne typy vozidiel, ktoré implementujú printVehicle()> metóda.
  • VehicleFactory> funguje ako rozhranie Creator (Factory Interface) s metódou createVehicle()> predstavujúce továrenskú metódu.
  • TwoWheelerFactory> a FourWheelerFactory> sú konkrétne triedy tvorcov (Concrete Factories) implementujúce VehicleFactory> rozhranie na vytváranie inštancií konkrétnych typov vozidiel.

Prípady použitia návrhového vzoru továrenskej metódy

Tu je niekoľko bežných aplikácií vzoru Factory Method Design:

  • Tvorivé rámce:
    • JDBC (Java Database Connectivity) vo veľkej miere využíva továrne na vytváranie spojení, príkazov a sád výsledkov. Rámce na vstrekovanie závislostí, ako sú Spring a Guice, sa pri vytváraní a správe fazuľiek vo veľkej miere spoliehajú na továrne.
  • GUI Toolkity:
    • Swing a JavaFX používajú továrne na vytváranie komponentov používateľského rozhrania, ako sú tlačidlá, textové polia a štítky, čo umožňuje prispôsobenie a flexibilitu návrhu používateľského rozhrania.
  • Logovacie rámce:
    • Logovacie rámce ako Log4j a Logback využívajú továrne na vytváranie loggerov s rôznymi konfiguráciami, čo umožňuje kontrolu nad úrovňami protokolovania a výstupnými cieľmi.
  • Serializácia a deserializácia:
    • Rámce serializácie objektov často používajú továrne na vytváranie objektov zo serializovaných údajov, ktoré podporujú rôzne formáty serializácie a verzovanie.
  • Systémy doplnkov:
    • Systémy založené na doplnkoch často používajú továrne na dynamické načítanie a vytváranie inštancií doplnkov, čo umožňuje rozšíriteľnosť a prispôsobenie.
  • Vývoj hry:
    • Herné motory často využívajú továrne na vytváranie rôznych typov herných objektov, postáv a úrovní, čím podporujú organizáciu kódu a flexibilitu.
  • Vývoj webových aplikácií:
    • Webové rámce niekedy používajú továrne na vytváranie komponentov zobrazenia, ovládačov a služieb, čo umožňuje modularitu a testovateľnosť webových aplikácií.

Výhody návrhového vzoru továrenskej metódy

Výhody vzoru návrhu továrenskej metódy sú:

metódy v jazyku Java
  • Oddelenie: Oddeľuje logiku vytvárania objektov od klientskeho kódu, ktorý tieto objekty používa. Vďaka tomu je kód flexibilnejší a udržiavateľný, pretože zmeny v procese vytvárania si nevyžadujú úpravy kódu klienta.
  • Rozšíriteľnosť: Zavádzanie nových typov produktov je jednoduché bez zmeny kódu klienta. Jednoducho potrebujete vytvoriť novú podtriedu Concrete Creator a implementovať továrenskú metódu na výrobu nového produktu.
  • Testovateľnosť: Zjednodušuje testovanie jednotiek tým, že vám umožňuje zosmiešňovať alebo zamlčovať vytváranie produktov počas testov. Môžete testovať rôzne implementácie produktu izolovane bez toho, aby ste sa spoliehali na skutočné vytváranie objektov.
  • Opätovná použiteľnosť kódu: Továrenskú metódu možno opätovne použiť v rôznych častiach aplikácie, kde je potrebné vytvoriť objekt. To podporuje centralizáciu a opätovné použitie logiky vytvárania objektov.
  • Zapuzdrenie: Skryje konkrétne triedy produktov z kódu klienta, čím sa kód stáva menej závislým od konkrétnych implementácií. To zlepšuje udržiavateľnosť a znižuje spojenie.

Nevýhody vzoru návrhu továrenskej metódy

Nevýhody vzoru továrenskej metódy sú:

  • Zvýšená zložitosť: Zavádza ďalšie triedy a rozhrania a pridáva vrstvu abstrakcie, vďaka ktorej je kód zložitejší na pochopenie a údržbu, najmä pre tých, ktorí tento vzor nepoznajú.
  • Režijné náklady: Použitie polymorfizmu a dynamickej väzby môže mierne ovplyvniť výkon, aj keď je to vo väčšine aplikácií často zanedbateľné.
  • Tesné prepojenie v rámci produktových hierarchií: Concrete Creators sú stále pevne spojené s príslušnými betónovými produktmi. Zmeny v jednom si často vyžadujú zmeny v druhom.
  • Závislosť na podtriedach betónu: Kód klienta stále závisí od abstraktnej triedy Creator, ktorá vyžaduje znalosť jej konkrétnych podtried, aby bolo možné správne volať metódu továrne.
  • Potenciál nadmerného používania: Je dôležité používať vzor továrenskej metódy uvážlivo, aby ste predišli nadmernému inžinierstvu aplikácie. Jednoduché vytváranie objektov sa dá často zvládnuť priamo bez potreby továrne.
  • Testovacie výzvy: Testovanie samotnej továrenskej logiky môže byť zložitejšie.