반응형
팩토리 메소드 패턴이란?
객체를 생성하기 위한 인터페이스를 정의하고, 어떤 클래스의 인스턴스르 생성할지에 대한 처리는 서브클래스가 결정하는 디자인 패턴이다.
팩토리 메소드 패턴을 사용하는 이유?
팩토리 메소드 패턴을 사용하는 이유는 클래스의 생성과 사용의 처리로직을 분리하여 결합도를 낮추기 위한 것이다.
- 생성할 객체 타입을 예측할 수 없을 때
- 생성할 객체를 기술하는 책임을 서브클래스에게 정의할때
- 객체 생성의 책임을 서브클래스에 위임시키고 서브클래스에 대한 정보를 은닉하고자 할때
팩토리 메소드의 장점 과 단점
장점
- 인스턴스를 만드는 과정를 수정하지 않고 새로운 인스턴스를 다른 방법으로 생성하도록 확장할 수 있다.
- 코드가 간결해진다.
단점
- 클래스가 많아진다.
팩토리 메소드 패턴을 적용할 때 참고
1. 자바8 인터페이스 default 메소드 2. 자바 9의 인터페이스의 private 메소드
실제 적용 예시
실제 자바코드에 어떻게 적용되어있는지 예시를 살펴보자.
단순한 팩토리 패턴
매개변수의 값에 따라 또는 메소드에 따라 각기 다른 인스턴스를 리턴하는 단순한 버전 의 팩토리 패턴
java.util.Calendar#getInstance()
public class CalendarExample {
public static void main(String[] args) {
log.info("Calendar 예시 : {}", Calendar.getInstance());
}
}
- etInstance()를 호출할 때마다 새로운 Calendar 객체가 생성된다.
- Calendar는 Gregorian형식(우리가 현재 쓰는), Julian 형식이 있는데, 이 두가지 경우를 모두 커버하기 위해 팩토리 메소드 패턴으로 디자인 되었다.
java.text.NumberFormat#getInstance()
BeanFactory xmlFactory = new ClassPathXmlApplicationContext("config.xml");
String hello = xmlFactory.getBean("hello", String.class);
BeanFactory javaFactory = new AnnotationConfigApplicationContext(Config.class);
String hi = javaFactory.getBean("hi", String.class);
- 국가에 따라 또는 화폐에 따라 다른 표현 방식을 커버하기 위해 팩토리 메소드 패턴으로 디자인 되었다.
- NumberFormat을 구현하는 클래스는 DecimalFormat, ExponentialFormat 등이 있다.
스프링 BeanFactory
Object 타입의 Product를 만드는 BeanFacotry라는 Creator
BeanFactory factory = new XmlBeanFactory(
new InputStreamResource(
new FileInputStream("oraclejavacommunity.xml")));
OracleJavaComm ojc = (OracleJavaComm)factory.getBean("oracleJavaBean");
- xml 설정과 java 설정으로 읽어오는 방식이다.
- Product에 해당하는 것은 Object
- ConcreteProduct에 해당하는 것은 xml 또는 class Bean
정리
팩토리 메소드 패턴을 사용하는 이유는 클래스간의 결합도를 낮추기 위한 것 같다.
결합도라는 것은 간단히 말해 클래스의 변경할 부분이 생겼을 때 얼마나 다른 클래스에도 영향을 주는가이다. 팩토리 메소드 패턴을 사용하는 경우 직접 객체를 생성해 사용하는 것을 방지하고 서브 클래스에 위임함으로써 보다 효율적인 코드 제어를 할 수 있고 의존성을 제거한다. 결과적으로 결합도 또한 낮출 수 있다.
'디자인패턴' 카테고리의 다른 글
컴포짓(composite) 패턴 (0) | 2022.07.30 |
---|---|
브릿지(Bridge)패턴 (0) | 2022.07.20 |
프로토타입(Prototype) 패턴 (0) | 2022.07.08 |
추상 팩토리 & 팩토리 메서드 패턴 & 팩토리 패턴 정의 (0) | 2022.06.19 |
싱글톤 패턴(singleton pattern) (0) | 2022.06.04 |