[객체 생성 패턴] Chapter 2-3. Factory Method Pattern : 인터페이스 적용하기
✍️ 팩토리 메서드 패턴, Java에서 찾아보기
지금까지 살펴봤던 팩토리 메서드 패턴 말고 조금 더 단순한 심플 팩토리 패턴이 있다. 사실 심플 팩토리 패턴은 디자인 패턴이라 보긴 어렵고 조건에 따라 서로 다른 객체를 만드는 메서드 그 자체라고 보 는편이 맞는 듯하다.
심플 팩토리 패턴, 그 형태를 살펴보면 말 그대로 조건에 따라서 서로 다른 객체를 만들어내는 메서드의 정의 그 자체다.
public class SimpleFactory {
public Object createProduct(String string) {
if (string.equals("turtle")) {
return new Turtleship();
} else if (string.equals("rabbit"))
return new Rabbitship();
throw new RuntimeException();
}
}
실제 자바에서 사용되는 심플 팩토리 패턴은 Calendar에서 찾아볼 수 있는데, Calendar.getInstance에 어떤 값을 주냐에 따라 서로 다른 인스턴스를 반환한다.
public class App {
public static void main(String[] args) {
System.out.println(Calendar.getInstance().getClass());
System.out.println(Calendar.getInstance(Locale.forLanguageTag("th-Th-x-lvariant-TH")).getClass());
System.out.println(Calendar.getInstance(Locale.forLanguageTag("ja-JP-x-lvariant-JP")).getClass());
}
}
// class java.util.GregorianCalendar
// class sun.util.BuddhistCalendar
// class java.util.GregorianCalendar
실제로 getInstance 메서드는 인자에 따라 서로 다른 객체를 생성하고 있다.
// Calendar.java
// ...
if (aLocale.hasExtensions()) {
String caltype = aLocale.getUnicodeLocaleType("ca");
if (caltype != null) {
cal = switch (caltype) {
case "buddhist" -> new BuddhistCalendar(zone, aLocale);
case "japanese" -> new JapaneseImperialCalendar(zone, aLocale);
case "gregory" -> new GregorianCalendar(zone, aLocale);
default -> null;
};
}
}
// ...
🍊 팩토리 메서드 패턴, Spring에서 찾아보기
심플 팩토리 말고 지금까지 공부했던 팩토리 메서드 패턴에 가까운 예시는 스프링에서 찾아볼 수 있다.
아래 코드에서 BeanFactory는 추상화된 Factory 지금까지의 예제로 치면 ShipFactory에 대응하고 ClassPathXmlApplicationContext, AnnotationConfigApplicationContext는 BeanFactory를 구현한 각기 다른 구현 클래스다. 이 또한 지금까지의 예제로 치면 TurtleshipFactory, RabbitshipFactory가 되겠다. 마지막으로 getBean은 orderShip에 대응하는 메서드로 제품에 해당하는 Object를 반환한다.
public class SpringBeanFactoryExample{
public static void main(String[] args){
BeanFactory xmlFactory = new ClassPathXmlApplicationContext("config.xml");
String hello = xmlFactory.getBean("hello",String.class);
System.out.println(hello);
BeanFactory javaFactory = new AnnotationConfigApplicationContext(Config.class);
String hi = javaFactory.getBean("hello",String.class);
System.out.println(hi);
}
}
인프런의 백기선님의 강의 코딩으로 학습하는 GoF의 디자인 패턴을 참고해서 작성했습니다.
'Java > Design Pattern with Java' 카테고리의 다른 글
[객체 생성 패턴] Chapter 3-2. Abstract Factory Pattern : 패턴 적용하기 (0) | 2022.04.18 |
---|---|
[객체 생성 패턴] Chapter 3-1. Abstract Factory Pattern : 패턴 소개 (0) | 2022.04.05 |
[객체 생성 패턴] Chapter 2-4. Factory Method Pattern : 장단점 (0) | 2022.04.04 |
[객체 생성 패턴] Chapter 2-3. Factory Method Pattern : 인터페이스 적용하기 (0) | 2022.04.04 |
[객체 생성 패턴] Chapter 2-2. Factory Method Pattern : 패턴 적용하기 (0) | 2022.03.31 |