[객체 생성 패턴] Chapter 2-5. Factory Method Pattern : 자바에서 찾아보는 팩토리 메서드 패턴

[객체 생성 패턴] 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의 디자인 패턴을 참고해서 작성했습니다.

 

코딩으로 학습하는 GoF의 디자인 패턴 - 인프런 | 강의

디자인 패턴을 알고 있다면 스프링 뿐 아니라 여러 다양한 기술 및 프로그래밍 언어도 보다 쉽게 학습할 수 있습니다. 또한, 보다 유연하고 재사용성이 뛰어난 객체 지향 소프트웨어를 개발할

www.inflearn.com