logo

Fabrikkmetode Designmønster

Fabrikkmetodens designmønster er en kreativt designmønster som gir et grensesnitt for å lage objekter i en superklasse, slik at underklasser kan endre typen objekter som skal opprettes. Den innkapsler objektskapingslogikk i en egen metode, og fremmer løs kobling mellom skaperen og de skapte objektene. Dette mønsteret er spesielt nyttig når de eksakte typene objekter som skal opprettes kan variere eller må bestemmes under kjøring, noe som muliggjør fleksibilitet og utvidbarhet i objektoppretting.

Innholdsfortegnelse



Hva er fabrikkmetodens designmønster?

Factory Method Design Pattern er et kreativt designmønster som brukes i programvareutvikling for å gi et grensesnitt for å lage objekter i en superklasse, samtidig som det lar underklasser endre typen objekter som skal opprettes. Den kapsler inn objektskapingslogikken i en egen metode, abstraherer instansieringsprosessen og fremmer løs kobling mellom skaperen og de skapte objektene. Dette mønsteret muliggjør fleksibilitet, utvidbarhet og vedlikeholdbarhet i kodebasen ved å la underklasser definere sin egen implementering av fabrikkmetoden for å lage spesifikke typer objekter.

c-streng i array

Når skal man bruke Factory Method Design Pattern?

Bruk fabrikkmetodedesignmønster:

  • Når du vil kapsle inn objektskaping: Hvis du har en kompleks objektopprettingsprosess eller hvis prosessen kan variere basert på forhold, kan innkapsling av denne logikken i en fabrikkmetode forenkle klientkoden og fremme gjenbrukbarhet.
  • Når du ønsker å koble klientkode fra konkrete klasser: Ved å bruke Factory Method Pattern kan du lage objekter gjennom et grensesnitt eller abstrakt klasse, og abstrahere bort de spesifikke implementeringsdetaljene til de konkrete klassene fra klientkoden. Dette fremmer løs kobling og gjør det enklere å modifisere eller utvide systemet uten å påvirke eksisterende klientkode.
  • Når du trenger å støtte flere produktvarianter: Hvis applikasjonen din trenger å lage forskjellige variasjoner av et produkt, eller hvis nye typer produkter kan bli introdusert i fremtiden, gir fabrikkmetodemønsteret en fleksibel måte å imøtekomme disse variasjonene ved å definere fabrikkmetoder for hver produkttype.
  • Når du ønsker å støtte tilpasning eller konfigurasjon: Fabrikker kan brukes til å innkapsle konfigurasjonslogikk, slik at klienter kan tilpasse opprettelsesprosessen ved å gi parametere eller konfigurasjonsalternativer til fabrikkmetoden.

Komponenter av fabrikkmetodedesignmønster

1. Skaper

Dette er en abstrakt klasse eller et grensesnitt som erklærer fabrikkmetoden. Skaperen inneholder vanligvis en metode som fungerer som en fabrikk for å lage objekter. Den kan også inneholde andre metoder som fungerer med de opprettede objektene.

2. Betongskaper

Concrete Creator-klasser er underklasser av Creator som implementerer fabrikkmetoden for å lage bestemte typer objekter. Hver betongskaper er ansvarlig for å lage et bestemt produkt.

3. Produkt

Dette er grensesnittet eller abstraktklassen for objektene som fabrikkmetoden lager. Produktet definerer det felles grensesnittet for alle objekter som fabrikkmetoden kan lage.

kat timpf søster

4. Betongprodukt

Konkrete produktklasser er de faktiske objektene som fabrikkmetoden lager. Hver betongproduktklasse implementerer produktgrensesnittet eller utvider produktabstraktklassen.

Eksempel på designmønster for fabrikkmetode

Nedenfor er problemformuleringen for å forstå Factory Method Design Pattern:

Vurder en programvareapplikasjon som må håndtere opprettelsen av ulike typer kjøretøy, for eksempel tohjulinger, trehjulinger og firehjulinger. Hver type kjøretøy har sine egne spesifikke egenskaper og oppførsel.

1. Uten fabrikkmetodedesignmønster

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();  } }>
Produksjon
I am two wheeler>

Hva er problemene med designen ovenfor?

I kodedesignet ovenfor:

  • Tett kobling: KlientklassenClient>instansierer direkte betongklassene (TwoWheeler>ogFourWheeler>) basert på inndatatypen gitt under konstruksjonen. Dette fører til tett kobling mellom byggherren og betongklassene, noe som gjør koden vanskelig å vedlikeholde og utvide.
  • Brudd på prinsippet om enkeltansvar (SRP): DeClient>klasse er ikke bare ansvarlig for å bestemme hvilken type kjøretøy som skal instansieres basert på inngangstypen, men også for å administrere livssyklusen til kjøretøyobjektet (f.eks. opprydding). Dette bryter med Single Responsibility Principle, som sier at en klasse bare skal ha én grunn til å endre seg.
  • Begrenset skalerbarhet: Å legge til en ny type kjøretøy krever modifisering avClient>klasse, som bryter med åpent lukket prinsipp. Denne designen er ikke skalerbar fordi den ikke kan tilpasses nye typer kjøretøy uten å endre eksisterende kode.

Hvordan unngår vi problemet?

  • Definer fabrikkgrensesnitt: Lage enVehicleFactory>grensesnitt eller abstrakt klasse med en metode for å lage kjøretøy.
  • Implementer betongfabrikker: Implementer betongfabrikkklasser (TwoWheelerFactory>ogFourWheelerFactory>) som implementererVehicleFactory>grensesnitt og gi metoder for å lage forekomster av bestemte typer kjøretøy.
  • Refactor-klient: EndreClient>klasse for å godta enVehicleFactory>forekomst i stedet for direkte instansiering av kjøretøy. Kunden vil be om et kjøretøy fra fabrikken, og eliminerer behovet for betinget logikk basert på kjøretøytyper.
  • Forbedret fleksibilitet: Med denne tilnærmingen er det like enkelt å legge til nye typer kjøretøy som å lage en ny fabrikkklasse for den nye kjøretøytypen uten å endre eksisterende klientkode.

2. Med fabrikkmetodedesignmønster

La oss dele opp koden i komponentmessig kode:

FactoryMethodDesignPattern

1. Produktgrensesnitt

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

2. Betongprodukter

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. Skapergrensesnitt (fabrikkgrensesnitt)

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

4. Betongskapere (betongfabrikker)

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();  } }>

Komplett kode for dette eksemplet:

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();  } }>
Produksjon
I am two wheeler I am four wheeler>

I koden ovenfor:

palindrom i java
  • Vehicle> fungerer som produktgrensesnittet, og definerer den vanlige metoden printVehicle()> som alle betongprodukter skal implementere.
  • TwoWheeler> og FourWheeler> er konkrete produktklasser som representerer ulike typer kjøretøy, implementerer printVehicle()> metode.
  • VehicleFactory> fungerer som Creator-grensesnittet (Factory Interface) med en metode createVehicle()> som representerer fabrikkmetoden.
  • TwoWheelerFactory> og FourWheelerFactory> er betongskaperklasser (betongfabrikker) som implementerer VehicleFactory> grensesnitt for å lage forekomster av bestemte typer kjøretøy.

Brukstilfeller av fabrikkmetodens designmønster

Her er noen vanlige bruksområder for Factory Method Design-mønsteret:

  • Kreasjonelle rammer:
    • JDBC (Java Database Connectivity) bruker fabrikker i utstrakt grad for å lage tilkoblinger, uttalelser og resultatsett. Avhengighetsinjeksjonsrammer som Spring og Guice er sterkt avhengige av fabrikker for å lage og administrere bønner.
  • GUI-verktøysett:
    • Swing og JavaFX bruker fabrikker til å lage UI-komponenter som knapper, tekstfelt og etiketter, noe som gir mulighet for tilpasning og fleksibilitet i UI-design.
  • Logging rammer:
    • Loggrammeverk som Log4j og Logback bruker fabrikker til å lage loggere med forskjellige konfigurasjoner, som muliggjør kontroll over loggingsnivåer og utdatadestinasjoner.
  • Serialisering og deserialisering:
    • Rammeverk for objektserialisering bruker ofte fabrikker til å lage objekter fra serialiserte data, og støtter forskjellige serialiseringsformater og versjonering.
  • Plugin-systemer:
    • Plugin-baserte systemer bruker ofte fabrikker for å laste og lage plugin-forekomster dynamisk, noe som gir mulighet for utvidbarhet og tilpasning.
  • Spillutvikling:
    • Spillmotorer bruker ofte fabrikker til å lage forskjellige typer spillobjekter, karakterer og nivåer, og fremmer kodeorganisering og fleksibilitet.
  • Webutvikling:
    • Web-rammeverk bruker noen ganger fabrikker for å lage visningskomponenter, kontrollere og tjenester, noe som muliggjør modularitet og testbarhet i webapplikasjoner.

Fordeler med Factory Method Design Pattern

Fordelene med Factory Method Design Pattern er:

android-versjoner
  • Frakobling: Den skiller objektopprettingslogikken fra klientkoden som bruker disse objektene. Dette gjør koden mer fleksibel og vedlikeholdbar fordi endringer i opprettelsesprosessen ikke krever endringer i klientkoden.
  • Utvidbarhet: Det er enkelt å introdusere nye produkttyper uten å endre klientkoden. Du trenger bare å opprette en ny Concrete Creator-underklasse og implementere fabrikkmetoden for å produsere det nye produktet.
  • Testbarhet: Det forenkler enhetstesting ved å tillate deg å håne eller stoppe produktoppretting under tester. Du kan teste ulike produktimplementeringer isolert uten å stole på faktisk objektoppretting.
  • Gjenbrukbarhet av kode: Fabrikkmetoden kan gjenbrukes i ulike deler av applikasjonen der det er behov for objektoppretting. Dette fremmer sentralisering og gjenbruk av objektopprettingslogikk.
  • Innkapsling: Den skjuler de konkrete produktklassene fra klientkoden, noe som gjør koden mindre avhengig av spesifikke implementeringer. Dette forbedrer vedlikeholdsevnen og reduserer koblingen.

Ulemper med Factory Method Design Pattern

Ulempene med Factory Method Design Pattern er:

  • Økt kompleksitet: Den introduserer flere klasser og grensesnitt, og legger til et lag med abstraksjon som kan gjøre koden mer kompleks å forstå og vedlikeholde, spesielt for de som ikke er kjent med mønsteret.
  • Overhead: Bruken av polymorfisme og dynamisk binding kan påvirke ytelsen litt, selv om dette ofte er ubetydelig i de fleste applikasjoner.
  • Tett kopling innen produkthierarkier: Betongskapere er fortsatt tett koblet til deres tilsvarende betongprodukter. Endringer i den ene krever ofte endringer i den andre.
  • Avhengighet av betongunderklasser: Klientkoden avhenger fortsatt av den abstrakte Creator-klassen, og krever kunnskap om dens konkrete underklasser for å foreta korrekte fabrikkmetodekall.
  • Potensial for overforbruk: Det er viktig å bruke fabrikkmetodemønsteret med omtanke for å unngå å overkonstruere applikasjonen. Enkel objektoppretting kan ofte håndteres direkte uten behov for en fabrikk.
  • Testutfordringer: Å teste selve fabrikklogikken kan være mer kompleks.