팩토리 메서드 패턴(Factory Method Pattern)

박세건·2024년 5월 25일
0

디자인 패턴

목록 보기
13/17
post-thumbnail

팩토리 메서드 패턴이란, 객체의 생성을 담당하는 팩토리 클래스를 제공하여 캡슐화를 진행하고 대신 객체를 생성해주는 생성 디자인 패턴이다.
new 연산자를 통하여 객체를 생성하는 것이 아닌 팩토리 객체를 통하여 객체를 생성한다.
팩토리 클래스를 설계하고 이를 상속받는 서브 팩토리 객체들로 여러가지 제품 객체를 생성할 수 있다.
즉, 객체를 만들어내는 공장을 만드는 패턴

구조

  • Creator : 최상위 공장 객체
  • ConcreteCretor : 하위 공장 객체
  • Product : 최상위 제품 객체
  • ConcreteProduct : 하위 제품 객체

예시 코드

제품 클래스

// 제품 객체 추상화 (인터페이스)
interface IProduct {
    void setting();
}

// 제품 구현체
class ConcreteProductA implements IProduct {
    public void setting() {
    }
}

class ConcreteProductB implements IProduct {
    public void setting() {
    }
}

팩토리 클래스

// 공장 객체 추상화 (추상 클래스)
abstract class AbstractFactory {

    // 객체 생성 전처리 후처리 메소드 (final로 오버라이딩 방지, 템플릿화)
    final IProduct createOperation() {
        IProduct product = createProduct(); // 서브 클래스에서 구체화한 팩토리 메서드 실행
        product.setting(); // .. 이밖의 객체 생성에 가미할 로직 실행
        return product; // 제품 객체를 생성하고 추가 설정하고 완성된 제품을 반환
    }

    // 팩토리 메소드 : 구체적인 객체 생성 종류는 각 서브 클래스에 위임
    // protected 이기 때문에 외부에 노출이 안됨
    abstract protected IProduct createProduct();
}

// 공장 객체 A (ProductA를 생성하여 반환)
class ConcreteFactoryA extends AbstractFactory {
    @Override
    public IProduct createProduct() {
        return new ConcreteProductA();
    }
}

// 공장 객체 B (ProductB를 생성하여 반환)
class ConcreteFactoryB extends AbstractFactory {
    @Override
    public IProduct createProduct() {
        return new ConcreteProductB();
    }
}

추가적으로 추상클래스를 인터페이스 변경해서 적용시킬 수 있는데 이때, 인터페이스에 default 메서드를 사용하여 구현한다.

시기

  • 생성과 기능 로직을 분리하여 결합도 낮출때
  • 객체에 캡슐화를 통해 정보 은닉 처리 할때
  • 구성 요소를 편리하게 확장시킬 수 있는 방법을 제공할때

장점

  • 생성에 대해 전처리, 후처리 가능
  • 캡슐화를 통한 내부 구조 숨김
  • 생성에만 집중하는 클래스 : 단일 책임 원칙 준수
  • 새로운 제품 인스턴스를 쉽게 추가 : 개방 폐쇄 원칙 준수

단점

  • 구현체가 늘어나면 팩토리 클래스도 증가 -> 클래스 수 증가
  • 코드 복잡성 증가
profile
멋있는 사람 - 일단 하자

0개의 댓글