반응형

팩토리 메서드(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) 개방폐쇄의 원칙을 지키는 코드가 완성되었다.

 

핵심 정리

  • 구체적인 팩토리 메서드 안에서 구체적인 제품을 만들어낸다.

 

팩토리 메서드 패턴 단점

  • 클래스의 수가 늘어난다.
반응형