본문 바로가기

Design Patterns

[생성 패턴] 추상 팩토리 패턴(Abstract Factory Pattern)

추상 팩토리 패턴 이란?

  • 서로 관련있는 여러 객체를 만들어주는 인터페이스
    어떤 클래스이 인스턴스를 사용하는지 감출 수 있다.
  • 서로 관련이 있는 객체들을 통째로 묶에서 팩토리 클래스로 만들고 팩토리를 조건에 따라 생성하도록 다시 팩토리를 만들어 객체를 생성하는 패턴
  • 실제 객체가 무엇인지 알지 못해도 객체를 생성하고 조작할 수 있도록 하여 객체가 생성되거나 구성, 표현되는 방식과 무관하게 시스템을 독립적으로 만들 수 있게 도와줄 수 있

 

추상 팩토리 패턴 특징

 

패턴 사용 시기

  • 관련 제품의 다양한 제품 군과 함께 작동해야 할때, 해당 제품의 구체적인 클래스에 의존하고 싶지 않은 경우
  • 여러 제품군 중 하나를 선택해서 시스템을 설정해야하고 한 번 구성한 제품을 다른 것으로 대체할 수도 있을 때
  • 제품에 대한 클래스 라이브러리를 제공하고, 그들의 구현이 아닌 인터페이스를 노출시키고 싶을 때

 

패턴 장점

  • 객체를 생성하는 코드를 분리하여 클라이언트 코드와 결합도를 낮출 수 있다.
  • 제품 군을 쉽게 대체 할 수 있다.
  • 단일 책임 원칙 준수
  • 개방 / 폐쇄 원칙 준수

 

패턴 단점

  • 각 구현체마다 팩토리 객체들을 모두 구현해주어야 하기 때문에 객체가 늘어날때 마다 클래스가 증가하여 코드의 복잡성이 증가한다. (팩토리 패턴의 공통적인 문제점)
  • 기존 추상 팩토리의 세부사항이 변경되면 모든 팩토리에 대한 수정이 필요해진다. 이는 추상 팩토리와 모든 서브클래스의 수정을 가져온다. 
  • 새로운 종류의 제품을 지원하는 것이 어렵다. 새로운 제품이 추가되면 팩토리 구현 로직 자체를 변경해야한다.

 

패턴 예제

엘레베이터를 만들기 위해 문과 모터를 만들어주는 공장이 존재한다고 가정하겠습니다.
그리고 엘레베이터 제조사는 LG와 삼성이 있다고 가정하겠습니다.

즉, LG공장에서는 LG 브랜드의 문과 모터를 만들고, 삼성 공장에서는 삼성 브랜드의 문과 모터를 만듭니다.

 

부품(이전 팩토리 메서드와 동일)

//LG 브랜드의 문 구현체
public class LGDoor implements Door {
    public LGDoor() {
        System.out.println("LG Door 생성");
    }
}
//LG 브랜드의 모터 구현체
public class LGMotor implements Motor {
    public LGMotor() {
        System.out.println("LG Motor 생성");
    }
}

 

엘레베이터를 만들어주는 LGElevatorFactory와 SamsungElevatorFactory 클래스를 정의하고, 이들을 캡슐화하는 ElevatorFactory 인터페이스를 정의합니다.
엘레베이터 팩토리에서 각각 브랜드에 맞는 문과 모터를 생성합니다.

//LG 브랜드 엘레베이터를 생성해주는 팩토리 클래스
public class LGElevatorFactory implements ElevatorFactory{
    @Override
    public Door createDoor() {
        return new LGDoor();
    }

    @Override
    public Motor createMotor() {
        return new LGMotor();
    }
}
//캡슐화
public interface ElevatorFactory {
    Door createDoor();
    Motor createMotor();
}

다음으로는 FactoryOfElevatorFactory 클래스를 확인하겠습니다.
이 클래스는 팩토리 패턴에서의 팩토리와 하는 일이 동일합니다.

브랜드에 따라 어느 브랜드의 엘레베이터를 만들어주지를 결정합니다.
부품이 아니라 엘레베이터를 생성한다는 것이 핵심

public class FactoryOfElevatorFactory {
    public void createElevator(Brand brand) {
        ElevatorFactory elevatorFactory = null;

        switch (brand) {
            case LG -> {
                elevatorFactory = new LGElevatorFactory();
                break;
            }
            case SamSung -> {
                elevatorFactory = new SamSungElevatorFactory();
                break;
            }
        }

        elevatorFactory.createDoor();
        elevatorFactory.createMotor();
    }
}
``` 엘레베이터를 사용할 Client입니다.

> 마지막으로 

```java
public class AbstractFactoryClient {
    public static void main(String[] args) {
        FactoryOfElevatorFactory factoryOfElevatorFactory = new FactoryOfElevatorFactory();
        factoryOfElevatorFactory.createElevator(Brand.LG);
    }
}

 

정리

추상 팩토리 패턴은 팩토리 메서드 패턴을 한층 더 캡슐화한 방식이라고 생각합니다.

  • 객체를 생성할 때 분기에 따라 다른 값이 나온다. => 팩토리 메서드 패턴
  • 위에 상황에서 생성해야 하는 객체의 묶음이 존재한다. => 추상 팩토리 패턴

 



Calendar
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
더보기
Archives
Visits
Today
Yesterday