JAVA/JAVA Design Pattern

추상 팩토리 (Abstract Factory) 패턴

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

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

추상 팩토리 패턴은 관련된 객체들을 그룹(제품 계열)으로 묶어 생성하는 방법을 제공하는 패턴입니다. 구체적인 클래스에 의존하지 않고 인터페이스를 통해 객체를 생성할 수 있도록 도와줍니다.

주요 특징

  • 서로 관련된 제품군을 생성하는 팩토리 인터페이스를 제공합니다.
  • 구체적인 팩토리 클래스가 제품 객체를 생성합니다.
  • 클라이언트는 구체적인 클래스에 의존하지 않고, 팩토리 인터페이스를 통해 객체를 사용합니다.

2. 팩토리 메서드와의 차이점

팩토리 메서드추상 팩토리는 모두 객체 생성을 캡슐화하지만,
다음과 같은 차이점이 있습니다:

팩토리 메서드 추상 팩토리
단일 제품을 생성한다. 여러 제품 계열을 생성한다.
서브클래스가 팩토리 메서드를 구현한다. 인터페이스를 통해 팩토리 그룹을 제공한다.
구현이 비교적 단순하다. 구현이 복잡하지만 확장성이 뛰어나다.

3. 클래스 다이어그램

                    +-----------------+
                    | AbstractFactory |
                    +-----------------+
                               |
        +----------------------+-------------------+
        |                                          |
+------------------+                      +------------------+
| ConcreteFactoryA |                      | ConcreteFactoryB |
+------------------+                      +------------------+
        |                                          |
+------------------+                      +------------------+
|    ProductA1     |                      |    ProductA2     |
|    ProductB1     |                      |    ProductB2     |
+------------------+                      +------------------+

설명:

  • AbstractFactory : 제품군을 생성하는 인터페이스입니다.
  • ConcreteFactoryA / ConcreteFactoryB : 제품군 A와 B를 생성하는 구체 팩토리입니다.
  • ProductA1, ProductA2, ProductB1, ProductB2 : 서로 다른 구체 제품입니다.

4. 다양한 제품 계열을 생성하는 방법

다양한 제품 계열을 생성하기 위해 팩토리 인터페이스를 사용합니다. 각 제품 계열에 대해 구체적인 팩토리 클래스를 만들면, 클라이언트는 추상 팩토리를 통해 제품을 사용할 수 있습니다.

예제 시나리오

  • GUI 라이브러리
    • 윈도우 (Windows) 스타일 UI
    • 맥 (Mac) 스타일 UI

5. 실제 사용 사례

1. GUI 툴킷

운영체제에 따라 서로 다른 UI 요소를 생성할 때 추상 팩토리를 사용합니다.

  • WindowsFactory → WindowsButton, WindowsMenu
  • MacFactory → MacButton, MacMenu

2. 데이터베이스 연결

데이터베이스 종류에 따라 서로 다른 연결 객체를 생성할 수 있습니다.

  • OracleFactory → OracleConnection
  • MySQLFactory → MySQLConnection

6. 예제 코드

추상 팩토리 패턴 구현

// 1. Abstract Product
interface Button {
    void render();
}

interface Menu {
    void display();
}

// 2. Concrete Product A
class WindowsButton implements Button {
    public void render() {
        System.out.println("Rendering Windows Button");
    }
}

class WindowsMenu implements Menu {
    public void display() {
        System.out.println("Displaying Windows Menu");
    }
}

// 3. Concrete Product B
class MacButton implements Button {
    public void render() {
        System.out.println("Rendering Mac Button");
    }
}

class MacMenu implements Menu {
    public void display() {
        System.out.println("Displaying Mac Menu");
    }
}

// 4. Abstract Factory
interface GUIFactory {
    Button createButton();
    Menu createMenu();
}

// 5. Concrete Factory A
class WindowsFactory implements GUIFactory {
    public Button createButton() {
        return new WindowsButton();
    }
    public Menu createMenu() {
        return new WindowsMenu();
    }
}

// 6. Concrete Factory B
class MacFactory implements GUIFactory {
    public Button createButton() {
        return new MacButton();
    }
    public Menu createMenu() {
        return new MacMenu();
    }
}

// 7. Client Code
public class AbstractFactoryExample {
    public static void main(String[] args) {
        GUIFactory factory;

        // Windows UI 생성
        factory = new WindowsFactory();
        Button button1 = factory.createButton();
        Menu menu1 = factory.createMenu();
        button1.render();
        menu1.display();

        // Mac UI 생성
        factory = new MacFactory();
        Button button2 = factory.createButton();
        Menu menu2 = factory.createMenu();
        button2.render();
        menu2.display();
    }
}

출력 결과

Rendering Windows Button
Displaying Windows Menu
Rendering Mac Button
Displaying Mac Menu

7. 결론

추상 팩토리 패턴은 관련된 객체들을 그룹으로 묶어 생성할 때 유용합니다. 팩토리 메서드보다 확장성이 뛰어나지만, 구조가 더 복잡해질 수 있습니다. 주로 플랫폼에 독립적인 UI 요소데이터베이스 연결 등에서 많이 사용됩니다.

반응형

'JAVA > JAVA Design Pattern' 카테고리의 다른 글

JAVA - 프로토타입(Prototype) 패턴  (0) 2024.12.23
빌더(Builder) 패턴  (0) 2024.12.22
팩토리 메서드(Factory Method) 패턴  (0) 2024.12.20
Singleton Pattern in Java  (0) 2024.12.19
JAVA 디자인 패턴 개요  (0) 2024.12.18