JAVA/JAVA Design Pattern

JAVA 추상 팩토리 (Abstract Factory) 패턴

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

JAVA 추상 팩토리 (Abstract Factory) 패턴

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
JAVA 빌더(Builder) 패턴  (0) 2024.12.22
JAVA 팩토리 메서드(Factory Method) 패턴  (0) 2024.12.20
JAVA Singleton Pattern  (0) 2024.12.19
JAVA 디자인 패턴 개요  (0) 2024.12.18