1. 개요
2. 팩토리 패턴이란?
팩토리는 메소드 호출에서 프로토타입 클래스(일명 인터페이스)의 객체를 생성하는 클래스입니다.
팩토리 패턴은 사용자에게 생성 로직을 숨기면서 공통 인터페이스의 객체를 생성하고자 할 때 좋습니다.3. 어떻게 구현합니까?
3.1. 알리미 인터페이스 구현
Notifier
인터페이스 는 프로토타입이며 다른 알림 클래스가 이를 구현합니다.public interface Notifier<T> {
void notify(T obj);
}
보시다시피
Notifier 클래스는
notify
라는 메서드가 하나 있는 일반 클래스입니다 .3.2. 알리미 클래스 구현
public class StringNotifier implements Notifier<String> {
@Override
public void notify(String str) {
System.out.println("Notifying: " + str);
}
}
public class DateNotifier implements Notifier<Date> {
@Override
public void notify(Date date) {
System.out.println("Notifying: " + date);
}
}
이제
Notifier
인터페이스를 사용하는 두 개의 클래스가 있습니다. 하나는 간단한 텍스트를 출력하고 다른 하나는 날짜를 게시합니다.3.3. Factory 구현
팩토리 클래스는 유일한 메소드인 getNotifier()
가 호출 될 때마다 알리미 인스턴스를 생성합니다 :public class NotifierFactory {
public <T> Notifier<T> getNotifier(Class<T> c) {
if (c == String.class) {
return Record.STRING.make();
}
if (c == Date.class) {
return Record.DATE.make();
}
return null;
}
}
위의 코드에서
Record 는
STRING
및DATE
라는 두 개의 상수가 있는 열거형입니다 .3.4. 기록 구현
Record 열거형은 유효한 알리미 클래스 의 레코드를 유지하고 팩토리 클래스가 호출할 때마다 인스턴스를 생성합니다
.public enum Record {
STRING {
@Override
public Notifier<String> make() {
return new StringNotifier();
}
},
DATE {
@Override
public Notifier<Date> make() {
return new DateNotifier();
}
};
public abstract <T> Notifier<T> make();
}
팩토리 패턴을 성공적으로 구현했습니다.
4. 이용
Main
클래스 에서 팩토리를 사용합시다 .public static void main(String[] args) {
NotifierFactory factory = new NotifierFactory();
Notifier<String> stringNotifier = factory.getNotifier(String.class);
Notifier<Date> dateNotifier = factory.getNotifier(Date.class);
stringNotifier.notify("Hello world!");
dateNotifier.notify(new Date());
}
이제 코드를 컴파일하고 실행해야 합니다.
$ javac Main.java
$ java Main
Notifying: Hello world!
Notifying: Wed Oct 19 17:36:38 TRT 2022
보시다시피 팩토리는 적절한 유형의 두 가지 알림 인스턴스를 성공적으로 생성했습니다.