팩토리 메서드 패턴

taeheon95·2021년 7월 30일

디자인 패턴

목록 보기
2/5
post-thumbnail

의도

GoF는 아래와 같이 팩토리 메소드 패턴의 의도를 정의했다.

객체를 생성하기 위해 인터페이스를 정의하지만 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브 클래스가 내리도록 합니다.

요약

  • 객체 생성을 캡슐화하는 패턴
  • Creator의 하위 클래스에서 팩토리 메소드를 정의하여, 팩토리 메소드 호출로 ConcreteProduct 객체를 반환하게 한다.

활용성

팩토리 메소드는 다음과 같은 상황에 사용합니다.

  • 어떤 클래스가 자신이 생성해야 하는 객체의 클래스를 예측할 수 없을 때
  • 생성할 객체를 기술하는 책임을 자신의 서브클래스가 지정했으면 할 때
  • 객체 생성의 책임을 몇 개의 보조 서브클래스 가운데 하나에 위임하고, 어떤 서브클래스가 위임자인지에 대한 정보를 최소화하고 싶을 때

자바 코드

Product 인터 페이스
  • ConcreteProduct 클래스에서 공통적으로 사용할 메소드를 만든다.
public interface IProduct {
    void use();
}
Factory 추상 클래스(Creator 클래스)
  • ConcreteFactory 클래스에서 공통적으로 사용할 메소드와 팩토리 메소드가 될 추상 메소드를 만든다.
public abstract class AbstractFactory {
    public IProduct makeProduct(String type){
        IProduct product = createProduct(type);
        product.use();
        return product;
    }
    abstract IProduct createProduct(String type);
}
FactoryFirst 클래스
  • 추상 클래스를 상속받고 팩토리 메소드 구체화하여 Product 객체를 반환한다.
public class FactoryFirst extends AbstractFactory {
    @Override
    IProduct createProduct(String type) {
        switch (type){
            case "First":
                return new ProductFirst();
            case "Second":
                return new ProductSecond();
            default:
                return new ProductDefault();
        }
    }
}
메인 함수
  • 메인 함수에서 구체화된 객체가 아닌 추상화 된 객체로 받아 공통적인 메소드를 통해 접근 할 수 있게 한다.
public class MainEntry {
    public static void main(String[] args) {
        AbstractFactory factory = new FactoryFirst();
        IProduct product = factory.makeProduct("first");
        product.use();
    }
}

참조

에릭 감마•리처드 헬름•랄프 존스•존 블리시다스, 『GoF의 디자인 패턴』, 프로텍 미디어(2015)
John Grib, 2019년 11월 21일, https://johngrib.github.io/wiki/factory-method-pattern/

0개의 댓글