GeeksforGeeks (Dansk)
Det er et skabelsesmønster, der taler om oprettelsen af et objekt. Fabriksdesignmønsteret siger, at der defineres en grænseflade (En java-grænseflade eller en abstrakt klasse) og lader underklasser bestemme, hvilket objekt der skal instantieres. Fabriksmetoden i grænsefladen lader en klasse udsætte instantieringen til en eller flere konkrete underklasser. Da dette designmønster taler om instantiering af et objekt, og så kommer det ind under kategorien skabelsesmønster. Hvis vi bemærker navnet Fabriksmetode, betyder det, at der er en metode, der er en fabrik, og generelt er fabrikker involveret i skabende ting, og her med dette oprettes et objekt. Det er en af de bedste måder at oprette et objekt på, hvor logikken til oprettelse af objekter er skjult for klienten. Lad os nu se på implementeringen.
Implementering:
1. Definer en fabriksmetode inde i en grænseflade.
2. Lad underklassen implementere ovenstående fabriksmetode, og beslut hvilket objekt du vil oprette.
I Java-konstruktører er ikke polymorfe, men ved at tillade underklasse at oprette et objekt tilføjer vi polymorf adfærd til instantieringen. Kort sagt forsøger vi at opnå Pseudo-polymorfisme ved at lade underklassen beslutte, hvad de skal oprette, og derfor kaldes denne fabriksmetode også som
Virtuel konstruktør. Lad os prøve at implementere det med et realtidsproblem og nogle kodningsøvelser.
Problemerklæring:
Overvej, at vi vil implementere en meddelelsestjeneste via e-mail, SMS og push-underretning. Lad os prøve at implementere dette ved hjælp af fabriksmetodedesignmønster. Først designer vi et UML-klassediagram til dette.
I ovenstående klassediagram har vi en grænseflade kaldet Notification, og tre konkrete klasser implementerer Notification-interface. En fabriksklasse NotificationFactory oprettes for at få et Notification-objekt. Lad os hoppe ind i kodningen nu.
Opret notifikationsgrænseflade
public
interface
Notification {
void
notifyUser();
}
Bemærk – Ovenstående interface kunne også oprettes som en abstrakt klasse.
Opret 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"
);
}
}
Opret en fabriksklasse NotificationFactory.java for at instantiere betonklasse.
Lad os nu bruge fabriksklasse til at oprette og få et objekt af konkret klasse ved at videregive nogle oplysninger.
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 realtid
Dette designmønster er blevet udbredt i JDK, såsom
1. getInstance () -metoden til java.util.Calendar, NumberFormat og ResourceBundle bruger fabriksmetodedesignmønster.
2. Alle indpakningsklasser som Integer, Boolean osv. I Java bruger dette mønster til at evaluere værdierne ved hjælp af 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 nogle af eksemplerne, hvor designmetode til fabriksmetoder er blevet brugt.
Konklusion
Indtil videre har vi lært, hvad der er fabriksmetodemønster, og hvordan man implementerer det. Jeg tror nu, at vi har en god forståelse af fordelen ved denne designmekanisme.