추상 팩토리 패턴

GoF의 디자인패턴 중 객체생성의 추상 팩토리 패턴을 Java 로 정리한 글

관련있는 여러개의 인스턴스를 만들어주는 인터페이스로 분리하여 생성하는 패턴

1. 팩토리 메서드와 비교

팩토리 메서드

팩토리메서드는 인자 타입에 따라 여러타입의 객체를 반환할 수도 있으 구체적인 클래스에서 객체를 생성

추상 팩토리

추상 팩토리 패턴은 이 추상 팩토리의 구현체에 존재하는 각각의 메서드들은 한가지 종류의 객체만 반환을 하고 추상적인 인터페이스를 통해 생성

2. 구체적인 차이점

  1. Factory 클래스에서 객체에 대한 생성을 지원하는 범위

    • 팩토리 메소드 패턴

      • 한 팩토리당 한 종류 ( create 메서드가 Factory 클래스에 1개) ⇒ 만들어줘→ 뭐만 내가 결정하면됨.

      • 한 개의 메서드로 여러 개의 객체를 만들수 있다.

    • 추상 팩토리 패턴

      • 한 팩토리에서 서로 연관된 여러 종류 모두 지원( create() 메서드가 팩토리 클래스에 여러 개)

        • A로 만들어A를 만들어줌 , B로 만들어B를 만들어줌 (선택지 자체에 구체적인 뭘 만들어달라는게 있음, 선택지 자체를 만들어서 줌.)

      • 구상 클래스에 의존하지 않고 여러 개의 관련된 객체를 하나의 팩토리로 묶음

  2. 팩토리 메서드에서 만드는 객체의 종류

    • 팩토리 메소드 패턴의 팩토리 메소드

      • 인자에 따라 객체의 종류가 결정됨 → 만들어줘 A → A클래스를 골라서 인스턴스 생성

    • 추상 팩토리 패턴 패턴의 팩토리 메서드

      • 인자에 따라 관련된 객체들을 생성하는 팩토리의 종류가 결정됨 → A 만들어줘 하면 → A Factory를 골라서 만듬.

  3. 포커스

    • 팩토리 메서드 패턴

      • 메서드(Factory Method) 레벨에서 포커스를 맞춤

      • 클라이언트의 인스턴스 생성 및 구성에 대한 책임을 덜어줌

    • 추상 팩토리 패턴

      • 클래스(Abstract Factory) 레벨에서 포커스를 맞춤

      • 각 Product들이 다른 클래스와 함께 사용될 때의 제약사항을 강제할 수 있다.

      • 단, 새로운 Factory를 추가할 때 많은 작업이 필요하다.

  4. Inhritance(상속), Composition(구성)

    • 팩토리 메서드 패턴

      • 상속을 사용하여 객체의 인스턴스 생성에 대해서는 서브클래스에 의존

      • 지역 레퍼런스 없이 바로 하위 클래스의 함수를 호출하여 객체를 만듦

    • 추상 팩토리 패턴

      • 지역 레퍼런스를 두어 , 외부로부터 Factory 객체를 DI 받아서 위임.

한마디로 팩토리 메서드는 적인 객체 생성 과정을 하위 또는 구체적 클래스에 옮기는게 목적이고, 추상팩토리는 여러 객체를 구체적인 클래스에 의존적이지 않게 해주는게 목적이다.

3. 사용예

  • java.xml 파일

    • DocumentBuilderFactory

  • Spring FactoryBean

    • 인터페이스인데, 이걸 구현 받아서→ 등록만 해놓으면 Bean으로 이 객체가 쭉쭉 나오는 방식.

    • Factory등록해놓으면 Ship.class를 통해서 빈을가져오면 알아서 Factory에서 빼서 가져오는 방식

Last updated