GeeksforGeeks (한국어)
객체 생성에 대해 이야기하는 생성 디자인 패턴입니다. 팩토리 디자인 패턴은 인터페이스 (자바 인터페이스 또는 추상 클래스)를 정의하고 서브 클래스가 인스턴스화 할 객체를 결정하도록합니다. 인터페이스의 팩토리 메서드를 사용하면 클래스가 하나 이상의 구체적인 하위 클래스로 인스턴스화를 연기 할 수 있습니다. 이 디자인 패턴은 개체의 인스턴스화에 대해 이야기하므로 창조 디자인 패턴의 범주에 속합니다. 팩토리 메서드라는 이름을 알아 차리면 팩토리라는 메서드가 있고 일반적으로 팩토리는 창조물과 관련이 있으며 여기에 객체가 생성되고 있음을 의미합니다. 객체 생성 로직이 클라이언트에게 숨겨진 객체를 생성하는 가장 좋은 방법 중 하나입니다. 이제 구현을 살펴 보겠습니다.
구현 :
1. 인터페이스 내부에 팩토리 메소드를 정의하십시오.
2. 서브 클래스가 위의 팩토리 메소드를 구현하고 생성 할 객체를 결정하도록합니다.
Java에서 생성자는 다형성이 아니지만 서브 클래스가 객체를 생성하도록 허용함으로써 인스턴스화에 다형성 동작을 추가합니다. 간단히 말해서, 우리는 서브 클래스가 무엇을 만들지 결정하도록하여 의사 다형성을 달성하려고합니다. 따라서이 Factory 메서드는
Virtual 생성자라고도합니다. 실시간 문제와 몇 가지 코딩 연습을 통해 구현해 보겠습니다.
문제 설명 :
이메일, SMS, 푸시 알림을 통해 알림 서비스를 구현하고 싶다고 생각하세요. 팩토리 메서드 디자인 패턴을 사용하여이를 구현해 보겠습니다. 먼저이를위한 UML 클래스 다이어그램을 디자인합니다.
위의 클래스 다이어그램에는 Notification이라는 인터페이스가 있으며 세 가지 구체적인 클래스가 Notification 인터페이스를 구현하고 있습니다. Notification 객체를 얻기 위해 팩토리 클래스 NotificationFactory가 생성됩니다. 이제 코딩을 시작하겠습니다.
알림 인터페이스 생성
public
interface
Notification {
void
notifyUser();
}
참고 -위의 인터페이스는 추상 클래스로도 생성 될 수 있습니다.
모든 구현 클래스 생성
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"
);
}
}
구체적인 클래스를 인스턴스화하는 팩토리 클래스 NotificationFactory.java를 작성하십시오.
이제 팩토리 클래스를 사용하여 몇 가지 정보를 전달하여 구체적인 클래스의 객체를 생성하고 가져옵니다.
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
실시간 예
이 디자인 패턴은
1과 같이 JDK에서 널리 사용되었습니다. java.util.Calendar, NumberFormat, ResourceBundle의 getInstance () 메소드는 팩토리 메소드 디자인 패턴을 사용합니다.
2. Java의 Integer, Boolean 등과 같은 모든 래퍼 클래스는이 패턴을 사용하여 valueOf () 메서드를 사용하여 값을 평가합니다.
3. java.nio.charset.Charset.forName (), java.sql.DriverManager # getConnection (), java.net.URL.openConnection (), java.lang.Class.newInstance (), java.lang.Class.forName ()은 팩토리 메서드 디자인 패턴이 사용 된 예입니다.
결론
지금까지 팩토리 메서드 디자인 패턴이 무엇이며 어떻게 구현하는지 배웠습니다. 이제 우리는이 디자인 메커니즘의 장점을 공정하게 이해했다고 생각합니다.