Mobile & App Stack/Java Software Architecture & Patterns

추상 팩토리 패턴(Abstract Factory) 핵심 정리: 팩토리 메서드와 차이점은?

임베디드 친구 2024. 12. 21. 10:50
반응형

소프트웨어를 설계하다 보면 OS별 UI 스타일이나 브라우저별 컴포넌트처럼 서로 연관된 객체들을 일관성 있게 생성해야 할 때가 있습니다. 이때 객체들의 '세트'를 안전하게 생성하도록 돕는 것이 바로 추상 팩토리 패턴(Abstract Factory Pattern)입니다.

오늘은 추상 팩토리 패턴의 개념부터 실무 예제, 그리고 많은 분이 헷갈려 하시는 팩토리 메서드 패턴과의 차이점까지 자세히 알아보겠습니다.

Generated by Gemini AI.


1. 추상 팩토리 패턴이란?

추상 팩토리 패턴은 관련된 객체들의 거대한 제품군(Family)을 생성하기 위한 인터페이스를 제공하는 패턴입니다.

클라이언트는 구체적인 클래스(예: WindowsButton, MacButton)를 직접 알 필요 없이, 팩토리 인터페이스를 통해 필요한 객체 세트를 통째로 공급받을 수 있습니다.

주요 핵심

  • 일관성 유지: 관련된 객체들이 함께 사용되도록 보장합니다. (예: 윈도우 테마에는 반드시 윈도우 버튼과 윈도우 메뉴가 쓰여야 함)
  • 느슨한 결합: 클라이언트 코드가 구체적인 제품 클래스에 의존하지 않습니다.

2. 팩토리 메서드 vs 추상 팩토리 차이점

이 두 패턴은 모두 객체 생성을 캡슐화하지만, 그 범위목적이 다릅니다.

구분 팩토리 메서드 (Factory Method) 추상 팩토리 (Abstract Factory)
핵심 목적 객체 생성 자체를 서브클래스에 위임 **연관된 객체들의 군(Family)**을 생성
생성 대상 단일 제품 (Product) 제품군 세트 (Multiple Products)
구현 방식 상속을 통한 메서드 오버라이딩 객체 구성을 통한 인터페이스 구현
복잡도 비교적 낮음 높음 (추상화 계층이 많음)

3. 추상 팩토리 패턴의 구조

패턴의 구조를 이해하면 코드가 훨씬 쉬워집니다.

  1. Abstract Factory: 모든 제품에 대한 생성 메서드를 선언하는 인터페이스입니다.
  2. Concrete Factory: 특정 테마(제품군)에 맞는 구체적인 객체들을 생성합니다.
  3. Abstract Product: 각 제품(버튼, 메뉴 등)의 공통 인터페이스입니다.
  4. Concrete Product: 팩토리에서 실제로 생성되는 구체적인 객체입니다.

4. Java 실전 예제: 다중 OS UI 툴킷

운영체제(OS)에 따라 버튼과 메뉴의 스타일이 달라지는 시나리오를 코드로 구현해 보겠습니다.

Step 1. 추상 제품(Interface) 정의

Java
 
// 모든 버튼의 공통 인터페이스
interface Button {
    void render();
}

// 모든 메뉴의 공통 인터페이스
interface Menu {
    void display();
}

Step 2. 구체 제품(Concrete Products) 구현

Java
 
// Windows 테마 제품군
class WindowsButton implements Button {
    public void render() { System.out.println("윈도우 스타일 버튼 렌더링"); }
}
class WindowsMenu implements Menu {
    public void display() { System.out.println("윈도우 스타일 메뉴 표시"); }
}

// Mac 테마 제품군
class MacButton implements Button {
    public void render() { System.out.println("맥 스타일 버튼 렌더링"); }
}
class MacMenu implements Menu {
    public void display() { System.out.println("맥 스타일 메뉴 표시"); }
}

Step 3. 추상 팩토리 및 구체 팩토리 구현

Java
 
// 추상 팩토리 인터페이스
interface GUIFactory {
    Button createButton();
    Menu createMenu();
}

// Windows 제품군을 생성하는 팩토리
class WindowsFactory implements GUIFactory {
    public Button createButton() { return new WindowsButton(); }
    public Menu createMenu() { return new WindowsMenu(); }
}

// Mac 제품군을 생성하는 팩토리
class MacFactory implements GUIFactory {
    public Button createButton() { return new MacButton(); }
    public Menu createMenu() { return new MacMenu(); }
}

Step 4. 클라이언트 코드 실행

Java
 
public class Application {
    public static void main(String[] args) {
        GUIFactory factory;
        
        // 현재 설정에 따라 팩토리를 선택 (예: Windows)
        factory = new WindowsFactory();
        
        Button btn = factory.createButton();
        Menu menu = factory.createMenu();
        
        btn.render();  // 출력: 윈도우 스타일 버튼 렌더링
        menu.display(); // 출력: 윈도우 스타일 메뉴 표시
    }
}

5. 추상 팩토리 패턴의 장점과 단점

👍 장점

  • 제품 간의 호환성 보장: 생성된 객체들이 서로 일치하는지 확인하며 사용할 필요가 없습니다.
  • 단일 책임 원칙(SRP): 객체 생성 코드를 한곳으로 추출하여 유지보수가 쉽습니다.
  • 개방-폐쇄 원칙(OCP): 기존 클라이언트 코드를 깨뜨리지 않고 새로운 제품군을 추가할 수 있습니다.

👎 단점

  • 복잡성 증가: 패턴을 구현하기 위해 새로운 인터페이스와 클래스가 많이 필요합니다.
  • 새로운 제품 추가의 어려움: 제품군 내에 새로운 제품(예: 툴바 추가)이 생기면 모든 팩토리 인터페이스를 수정해야 합니다.

결론: 언제 사용해야 할까?

추상 팩토리 패턴은 "시스템이 여러 제품군 중 하나로 구성되어야 하고, 이 제품군들이 함께 사용되어야 할 때" 최고의 효율을 발휘합니다. 다국어 지원 시스템, 테마 변경 시스템, 다양한 DB 드라이버 지원 등에서 적극적으로 활용해 보세요.


도움이 되셨다면 공감과 구독 부탁드립니다!

디자인 패턴 시리즈는 계속됩니다. 궁금한 점은 댓글로 남겨주세요!

반응형