Factory Method Pattern

2023, Mar 02    
  • 팩토리 메소드 패턴에는 원하는 객체를 생성하기 위한 abstract 메소드가 선언된 factory 클래스가 있어야한다.
  • 특정 도메인에 기반한 각각의 다른 객체를 만들고자 할 때 사용한다. 예를 들어 car에 대한 객체가 필요한데, 해상 도메인과 항공 도메인 각각에 다른 객체인 배와 비행기를 만들 때 사용한다.
  • 구현
    • 각 개체에 대한 팩토리 구현체를 만들고 구체적인 팩토리 메서드에서 원하는 개체를 반환할 수 있습니다.

1. Application Context

  • 스프링은 DI 프레임워크에서 팩토리 메서드 패턴을 적용하고 있다
    • 즉, 스프링은 빈 컨테이너를 빈을 생성하는 팩토리처럼 다루고 있다
    • 게다가 스프링은 주요 함수를 추상화해서 빈컨테이너 안에 BeanFactory 인터페이스로 정의하고 있다.

        public interface BeanFactory {
            getBean(Class<T> requiredType);
            getBean(Class<T> requiredType, Object... args);
            getBean(String name);
            // ...
        }
      
    • 이 getBean메서드들은 빈의 타입과 이름 등등으로 매칭되는 빈을 반환하는 팩토리 메서드인 셈이다.
    • Spring은 ApplicationContext 인터페이스로 BeanFactory를 확장해서 xml이나 annotation과 같은 일부 외부 구성을 한 bean 컨테이너를 올린다.
    • AnnotationConfigApplicationContext처럼 ApplicationContext 클래스를 implement해서 BeanFactory 인터페이스에서 상속된 다양한 팩토리 메소드를 통해 빈을 생성할 수 있다.

2. External Configuration

  • 이 패턴은 외부 구성에 따라 애플리케이션의 동작을 완전히 변경할 수 있다.
  • 만약에 어플리케이션의 autowire된 객체를 바꿔야한다면,

응용 프로그램에서 autowired 개체의 구현을 변경하려면 사용하는 ApplicationContext 구현을 조정할 수 있습니다.