GeeksforGeeks (Norsk)
Det er et skapelsesmønster som snakker om opprettelsen av et objekt. Fabrikkdesignmønsteret sier at definere et grensesnitt (Et java-grensesnitt eller en abstrakt klasse) og la underklassene bestemme hvilket objekt du vil instantiere. Fabriksmetoden i grensesnittet lar en klasse utsette instantiering til en eller flere konkrete underklasser. Siden dette designmønsteret snakker om instantiering av et objekt, så kommer det inn under kategorien skapelsesmønster. Hvis vi legger merke til navnet Fabrikkmetode, betyr det at det er en metode som er en fabrikk, og generelt er fabrikker involvert i skapende ting, og her blir det opprettet et objekt. Det er en av de beste måtene å lage et objekt der logikken til gjenoppretting av objekter er skjult for klienten. La oss nå se på implementeringen.
Implementering:
1. Definer en fabrikkmetode i et grensesnitt.
2. La underklassen implementere ovennevnte fabrikkmetode og bestem hvilket objekt du vil lage.
I Java-konstruktører er ikke polymorfe, men ved å tillate underklasse å lage et objekt, legger vi til polymorf oppførsel til instantieringen. Kort fortalt prøver vi å oppnå Pseudo-polymorfisme ved å la underklassen bestemme hva de skal lage, og så kalles denne Factory-metoden også som
Virtual constructor. La oss prøve å implementere det med et sanntidsproblem og litt koding.
Problemerklæring:
Vurder at vi ønsker å implementere en varslingstjeneste via e-post, SMS og push-varsling. La oss prøve å implementere dette ved hjelp av fabrikkmetodedesignmønster. Først skal vi utforme et UML-klassediagram for dette.
I klassediagrammet ovenfor har vi et grensesnitt som heter Notification, og tre konkrete klasser implementerer Notification interface. En fabrikklasse NotificationFactory er opprettet for å få et varslingsobjekt. La oss hoppe inn i kodingen nå.
Opprett varslingsgrensesnitt
public
interface
Notification {
void
notifyUser();
}
Merk – Over grensesnittet kan også opprettes som en abstrakt klasse.
Opprett alle implementeringsklasser
SMSNotification.java
public
class
SMSNotification
implements
Notification {
@Override
public
void
notifyUser()
{
System.out.println(
"Sending an SMS notification"
);
}
}
EmailNotification.java
public
class
EmailNotification
implements
Notification {
@Override
public
void
notifyUser()
{
System.out.println(
"Sending an e-mail notification"
);
}
}
PushNotification.java
public
class
PushNotification
implements
Notification {
@Override
public
void
notifyUser()
{
System.out.println(
"Sending a push notification"
);
}
}
Opprett en fabriksklasse NotificationFactory.java for å sette i gang konkret klasse.
La oss nå bruke fabrikklasse til å lage og få et objekt av konkret klasse ved å gi litt informasjon.
public
class
NotificationService {
public
static
void
main(String args)
{
NotificationFactory notificationFactory =
new
NotificationFactory();
Notification notification = notificationFactory.createNotification(
"SMS"
);
notification.notifyUser();
}
}
Output : Sending an SMS notification
Eksempler i sanntid
Dette designmønsteret har blitt mye brukt i JDK, for eksempel
1. getInstance () -metoden til java.util.Calendar, NumberFormat og ResourceBundle bruker fabrikkmetodedesignmønster.
2. Alle wrapper-klassene som Integer, Boolean etc, i Java bruker dette mønsteret til å evaluere verdiene ved hjelp av valueOf () -metoden.
3. java.nio.charset.Charset.forName (), java.sql.DriverManager # getConnection (), java.net.URL.openConnection (), java.lang.Class.newInstance (), java.lang.Class.forName () er noen av eksemplene der fabrikkmetodes designmønster har blitt brukt.
Konklusjon
Så langt har vi lært hva som er fabrikkmetodes designmønster og hvordan vi kan implementere det. Jeg tror nå vi har en god forståelse av fordelen med denne designmekanismen.