> For the complete documentation index, see [llms.txt](https://nelmm.gitbook.io/nelmm/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://nelmm.gitbook.io/nelmm/design-pattern/undefined/undefined-1.md).

# 추상 팩토리 패턴

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

### 1. 팩토리 메서드와 비교&#x20;

#### 팩토리 메서드

![](/files/p6lx9qmGPvvosZ2umHxf)

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

#### 추상 팩토리

![](/files/hc0xdwL3y0lgQcBwRX3H)

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

### 2. 구체적인 차이점

1. Factory 클래스에서 객체에 대한 생성을 지원하는 범위
   * 팩토리 메소드 패턴
     * 한 팩토리당 한 종류 ( create 메서드가 Factory 클래스에 1개) ⇒ **뭐** 만들어줘→ **뭐만 내가 결정하면됨.**
     * 한 개의 메서드로 여러 개의 객체를 만들수 있다.&#x20;
   * 추상 팩토리 패턴
     * 한 팩토리에서 서로 연관된 여러 종류 모두 지원( 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에서 빼서 가져오는 방식
