개발/자바

[java] 추상 팩토리(Abstract Factory) 패턴

조용한닭 2024. 1. 10. 16:19
728x90
반응형

추상 팩토리(Abstract Factory) 패턴

정의:

추상 팩토리 패턴은 서로 연관된, 또는 의존하는 객체들을 생성하기 위한 인터페이스를 제공하며, 각각의 구체적인 팩토리 클래스가 이를 구현하여 객체를 생성하는 디자인 패턴입니다. 이 패턴은 팩토리 메서드 패턴을 조합하여 여러 제품군을 생성하도록 설계되어 있습니다.

장점:

  1. 유연성과 확장성: 새로운 제품군을 도입하거나 기존 제품군을 확장하기가 용이합니다.
  2. 제품군 간의 일관성: 추상 팩토리는 연관된 제품들을 생성하므로, 이들이 함께 사용될 때 일관성을 유지할 수 있습니다.
  3. 클라이언트 코드 단순화: 클라이언트는 구체적인 클래스 이름을 알 필요 없이 팩토리를 통해 객체를 생성할 수 있습니다.

단점:

  1. 복잡성 증가: 새로운 제품이나 팩토리를 추가할 때마다 클래스 계통이 복잡해질 수 있습니다.
  2. 단일 책임 원칙 위배 가능성: 팩토리가 너무 많은 책임을 갖게 되어 단일 책임 원칙을 위배할 수 있습니다.

언제 사용하는지:

  1. 제품군을 일괄적으로 생성할 때: 관련된 여러 제품군을 한 번에 생성해야 하는 경우에 사용합니다.
  2. 제품군을 변경 가능한 경우: 서로 다른 제품군을 사용하고자 할 때 사용합니다.
  3. 제품군 간의 일관성이 중요한 경우: 여러 제품들이 함께 사용될 때 일관성이 유지되어야 하는 상황에서 사용합니다.

예시

// AbstractProductA: 제품군의 추상 클래스 또는 인터페이스
interface Window {
    void display();
}

// ConcreteProductA1: 실제로 생성될 제품 클래스
class WindowsXPWindow implements Window {
    @Override
    public void display() {
        System.out.println("Windows XP 창을 표시합니다.");
    }
}

// ConcreteProductA2: 다른 제품 클래스
class Windows10Window implements Window {
    @Override
    public void display() {
        System.out.println("Windows 10 창을 표시합니다.");
    }
}

// AbstractProductB: 다른 제품군의 추상 클래스 또는 인터페이스
interface Button {
    void click();
}

// ConcreteProductB1: 실제로 생성될 다른 제품 클래스
class WindowsXPButton implements Button {
    @Override
    public void click() {
        System.out.println("Windows XP 버튼을 클릭했습니다.");
    }
}

// ConcreteProductB2: 다른 제품 클래스
class Windows10Button implements Button {
    @Override
    public void click() {
        System.out.println("Windows 10 버튼을 클릭했습니다.");
    }
}

// AbstractFactory: 제품을 생성하는 인터페이스
interface GUIFactory {
    Window createWindow();
    Button createButton();
}

// ConcreteFactory1: 실제로 제품을 생성하는 클래스
class WindowsFactory implements GUIFactory {
    @Override
    public Window createWindow() {
        return new Windows10Window();
    }

    @Override
    public Button createButton() {
        return new Windows10Button();
    }
}

// ConcreteFactory2: 다른 제품을 생성하는 클래스
class WindowsXPFactory implements GUIFactory {
    @Override
    public Window createWindow() {
        return new WindowsXPWindow();
    }

    @Override
    public Button createButton() {
        return new WindowsXPButton();
    }
}

// Client: 팩토리를 사용하는 클라이언트 코드
public class AbstractFactoryExample {
    public static void main(String[] args) {
        // Windows 10 제품군을 생성하는 팩토리
        GUIFactory windowsFactory = new WindowsFactory();
        Window windows10Window = windowsFactory.createWindow();
        Button windows10Button = windowsFactory.createButton();

        windows10Window.display();  // 출력: Windows 10 창을 표시합니다.
        windows10Button.click();    // 출력: Windows 10 버튼을 클릭했습니다.

        // Windows XP 제품군을 생성하는 팩토리
        GUIFactory windowsXPFactory = new WindowsXPFactory();
        Window windowsXPWindow = windowsXPFactory.createWindow();
        Button windowsXPButton = windowsXPFactory.createButton();

        windowsXPWindow.display();  // 출력: Windows XP 창을 표시합니다.
        windowsXPButton.click();    // 출력: Windows XP 버튼을 클릭했습니다.
    }
}

 

이 예제에서는 GUIFactory 인터페이스가 추상 팩토리를 정의하고, WindowsFactoryWindowsXPFactory 클래스가 이를 구현하여 Windows 10과 Windows XP 제품군을 생성합니다. 클라이언트 코드에서는 필요한 팩토리를 선택하고 해당 팩토리의 createWindow()createButton() 메서드를 사용하여 객체를 생성합니다.

728x90
반응형