추상 팩토리(Abstract Factory)

유방현·2024년 11월 20일
0

추상 팩토리(Abstract Factory)

추상 팩토리는 생성(Creational) 패턴의 하나로, 관련된 객체들의 집합을 생성하기 위한 인터페이스를 제공합니다.

주요 특징:

  1. 구체적인 클래스를 지정하지 않고 관련성 있는 객체들의 집합을 생성할 수 있습니다
  2. 제품군(product family)을 쉽게 교체할 수 있습니다
  3. 제품 사이의 일관성을 유지할 수 있습니다
  4. 새로운 제품군을 추가하기 쉽습니다

GUI 테마를 예로 든 추상 팩토리 패턴의 구현:

// 추상 제품 - 버튼
interface Button {
    void render();
}

// 추상 제품 - 체크박스
interface Checkbox {
    void render();
}

// 라이트 테마 버튼
class LightButton implements Button {
    @Override
    public void render() {
        System.out.println("Rendering light theme button");
    }
}

// 다크 테마 버튼
class DarkButton implements Button {
    @Override
    public void render() {
        System.out.println("Rendering dark theme button");
    }
}

// 라이트 테마 체크박스
class LightCheckbox implements Checkbox {
    @Override
    public void render() {
        System.out.println("Rendering light theme checkbox");
    }
}

// 다크 테마 체크박스
class DarkCheckbox implements Checkbox {
    @Override
    public void render() {
        System.out.println("Rendering dark theme checkbox");
    }
}

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

// 구체적인 팩토리 - 라이트 테마
class LightThemeFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new LightButton();
    }

    @Override
    public Checkbox createCheckbox() {
        return new LightCheckbox();
    }
}

// 구체적인 팩토리 - 다크 테마
class DarkThemeFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new DarkButton();
    }

    @Override
    public Checkbox createCheckbox() {
        return new DarkCheckbox();
    }
}

// 클라이언트 코드
class Application {
    private Button button;
    private Checkbox checkbox;
    
    public Application(GUIFactory factory) {
        button = factory.createButton();
        checkbox = factory.createCheckbox();
    }
    
    public void render() {
        button.render();
        checkbox.render();
    }
}

// 메인 클래스
public class Main {
    public static void main(String[] args) {
        // 라이트 테마 사용
        Application lightApp = new Application(new LightThemeFactory());
        System.out.println("Light Theme:");
        lightApp.render();
        
        System.out.println("\nDark Theme:");
        // 다크 테마로 쉽게 전환
        Application darkApp = new Application(new DarkThemeFactory());
        darkApp.render();
    }
}

예제의 주요 구성 요소:

  1. 추상 제품 (Abstract Products):

    • Button, Checkbox 인터페이스
    • 제품군의 개별 제품들을 정의
  2. 구체적 제품 (Concrete Products):

    • LightButton, DarkButton
    • LightCheckbox, DarkCheckbox
    • 실제 구현체들
  3. 추상 팩토리 (Abstract Factory):

    • GUIFactory 인터페이스
    • 제품을 생성하는 메소드들을 선언
  4. 구체적 팩토리 (Concrete Factories):

    • LightThemeFactory, DarkThemeFactory
    • 실제로 제품을 생성하는 팩토리 구현체

추상 팩토리 패턴의 장점:

  1. 제품군의 일관성 보장
  2. 구체적인 클래스와의 결합도 감소
  3. 제품군 전체를 한 번에 교체 가능
  4. 단일 책임 원칙 준수

단점:

  1. 새로운 종류의 제품을 추가하기 어려움
  2. 코드가 복잡해질 수 있음

사용하면 좋은 경우:

  1. 여러 제품군을 다뤄야 할 때
  2. 제품군 간의 일관성이 중요할 때
  3. 기존 코드 수정 없이 새로운 제품군을 추가하고 싶을 때

실제 사용 예시:

  • GUI 라이브러리의 테마 시스템
  • 크로스 플랫폼 애플리케이션의 컴포넌트
  • 데이터베이스 드라이버 시스템
profile
코딩하는 직장인

0개의 댓글