반응형
팩토리 메서드(Factory method) 패턴 이란?
- 팩토리 메서드 패턴은 디자인 패턴 중 하나로, 객체지향 설계에서 자주 사용됨
- 객체 생성에 대한 책임을 서브 클래스로 분리하여 유연성을 높이는 것
- 인터페이스 안에 기본적인 구현이 있고, 구현부 중에 일부 바뀌어야 하는것 들을 추상 메서드로 분리해 하위 클래스에서 만드는것
기본적인 팩토리 메소드 패턴 예제
1.팩토리 인터페이스 정의
public interface SojuFactory {
default Soju orderSoju() {
Soju soju = createSoju();
return soju;
}
Soju createSoju();
}
public class Soju {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Soju를 리턴하는 orderSoju 메서드는 default 메서드로 정의하고, Soju를 만드는 로직은 하위클래스에서 구현하도록 하기위해 createSoju(); 메서드를 만든다.
2.Soju 클래스를 상속받는 GoodDaySoju 클래스 정의
public class GoodDaySoju extends Soju {
public GoodDaySoju() {
setName("GoodDay");
}
}
생성자에 Soju의 이름을 정해준다.
3.SojuFactory 인터페이스를 구현하는 GoodDaySojuFactory 클래스 구현
public class GoodDaySojuFactory implements SojuFactory{
@Override
public Soju createSoju() {
return new GoodDaySoju();
}
}
4.실행 결과 확인
public static void main(String[] args) {
Soju good = new GoodDaySojuFactory().orderSoju();
System.out.println(good.getName()); // GoodDay
}
기본 구조는 만들었고 이제 다른 종류의 Soju를 추가해보자
public class NiceDaySoju extends Soju { // NiceDaySoju 클래스 정의
public NiceDaySoju(){
setName("NiceDay");
}
}
public class NiceDaySojuFactory implements SojuFactory{ // NiceDaySoju 생성 팩토리 클래스 정의
@Override
public Soju createSoju() {
return new NiceDaySoju();
}
}
public static void main(String[] args) {
Soju good = new GoodDaySojuFactory().orderSoju();
System.out.println(good.getName()); // GoodDay
Soju nice = new NiceDaySojuFactory().orderSoju();
System.out.println(nice.getName()); // NiceDay
}
기존 코드를 전혀 건드리지 않고 새로운 제품을 추가한 확장에 대해서는 개방(OPEN)되어야 하지만 변경에 대해서는 폐쇄(CLOSE)되어야 한다는 객체지향 설계 5대 원칙 SOLID 중 하나인 (OCP/Open Close Principle) 개방폐쇄의 원칙을 지키는 코드가 완성되었다.
핵심 정리
- 구체적인 팩토리 메서드 안에서 구체적인 제품을 만들어낸다.
팩토리 메서드 패턴 단점
- 클래스의 수가 늘어난다.
반응형