헬린코린이
[Spring Framework] 팩토리 패턴 본문
팩토리 패턴(factory pattern)
- 객체를 생성하는 인터페이스는 미리 정의하되, 인스턴스를 만들 클래스의 결정은 서브 클래스 쪽에서 내리는
패턴입니다. 다시 말해 여러 개의 서브 클래스를 가진 슈퍼 클래스가 있을 때 인풋에 따라 하나의 자식 클래스의
인스턴스를 리턴해주는 방식입니다.
팩토리 패턴에서는 클래스의 인스턴스를 만드는 시점을 서브 클래스로 미룹니다.
이 패턴은 인스턴스화에 대한 책임을 객체를 사용하는 클라이언트에서 팩토리 클래스로 가져옵니다.
인터페이스를 하나 정의합니다.
package test;
public interface Phone {
void powerOn();
void powerOff();
void volumeUp();
void volumeDown();
}
이 인터페이스를 구현하는 자식클래스를 만듭니다.
package test;
public class ApplePhone implements Phone {
@Override
public void powerOn() {
System.out.println("애플폰 ON");
}
@Override
public void powerOff() {
System.out.println("애플폰 OFF");
}
@Override
public void volumeUp() {
System.out.println("애플폰 사운드 ++");
}
@Override
public void volumeDown() {
System.out.println("애플폰 사운드 --");
}
}
자식클래스 - 2
package test;
public class KiwiPhone implements Phone {
@Override
public void powerOn() {
System.out.println("키위폰 ON");
}
@Override
public void powerOff() {
System.out.println("키위폰 OFF");
}
@Override
public void volumeUp() {
System.out.println("키위폰 사운드 ++");
}
@Override
public void volumeDown() {
System.out.println("키위폰 사운드 --");
}
}
Factory class입니다.
package test;
public class BeanFactory {
public Object getBean(String beanName) {
if(beanName.equals("applePhone")) {
return new ApplePhone();
}else if(beanName.equals("KiwiPhone")) {
return new KiwiPhone();
}
return null;
}
}
팩트로 패턴의 장점으로는
- 팩토리 패턴은 클라이언트 코드로부터 서브 클래스의 인스턴스화를 제거하여 서로 간의 종속성을 낮추고, 결합도를 느슨하게 하며, 확장을 쉽게 합니다.
예를 들어, 위 예제에서 작성한 클래스 중 PC class에 대해 수정 혹은 삭제가 일어나더라고 클라이언트는 알 수 없기 때문에 코드를 변경할 필요도 없습니다.
Comments