본문 바로가기

JAVA/디자인 패턴

[Design Pattern] Abstract Factory(추상 팩토리) 패턴이란?

반응형
생성 패턴(Creational Pattern)


추상 팩토리 패턴(Abstract Factory Pattern)은 객체 생성을 추상화하는 디자인 패턴입니다. 이 패턴은 관련성이 있는 객체를 묶어서 특정 제품군을 생성하는 인터페이스를 제공합니다. 이 때, 어떤 구체적인 클래스를 사용할지는 팩토리 클래스에서 결정합니다.

추상 팩토리 패턴은 객체 생성을 추상화하기 때문에 클라이언트 코드에서 객체 생성 부분을 추상화된 인터페이스로 분리시킬 수 있습니다. 따라서 클라이언트 코드는 구체적인 객체를 생성하는 부분을 알지 못하며, 팩토리 클래스가 제공하는 인터페이스를 통해 객체를 생성합니다. 이는 코드의 유연성과 확장성을 높이는데 도움이 됩니다.

추상 팩토리 패턴은 다음과 같은 구성요소로 이루어집니다.

  1. 추상 팩토리(Abstract Factory) : 추상 팩토리는 관련성이 있는 객체들의 생성을 추상화한 인터페이스입니다. 이 인터페이스에서는 객체를 생성하는 추상 메서드들이 선언되어 있습니다.

  2. 구체적인 팩토리(Concrete Factory) : 구체적인 팩토리는 추상 팩토리를 구현한 클래스입니다. 구체적인 팩토리에서는 추상 팩토리에서 선언된 추상 메서드를 구현하여 실제 객체를 생성합니다.

  3. 추상 제품(Abstract Product) : 추상 제품은 팩토리에서 생성되는 객체의 추상 클래스 또는 인터페이스입니다. 이 인터페이스에서는 객체의 공통 메서드들이 선언되어 있습니다.

  4. 구체적인 제품(Concrete Product) : 구체적인 제품은 추상 제품을 구현한 클래스입니다. 구체적인 팩토리에서는 구체적인 제품을 생성하여 반환합니다.

추상 팩토리 패턴은 객체 생성을 추상화하고, 객체 간의 관련성을 유지하는데 도움이 됩니다. 또한 팩토리 클래스를 사용하여 클라이언트 코드에서 객체 생성 부분을 분리함으로써 코드의 유연성과 확장성을 높이는데 도움이 됩니다.

 

 

Abstract Factory 패턴을 사용 하는 이유

 

추상 팩토리 패턴은 관련된 객체들의 집합을 생성하기 위한 인터페이스를 제공합니다. 이 인터페이스를 통해 구체적인 클래스에 의존하지 않고 객체를 생성할 수 있습니다. 이렇게 하면 코드의 유연성과 재사용성이 높아지고, 플랫폼이나 환경의 변화에 쉽게 대응할 수 있습니다.

 

예를 들어, 윈도우와 맥 OS에서 동작하는 GUI 애플리케이션을 개발한다고 가정해보세요. 각 OS에 맞는 버튼, 체크박스, 텍스트 필드 등의 컴포넌트를 생성해야 합니다. 이때 추상 팩토리 패턴을 사용하면 윈도우용 팩토리와 맥 OS용 팩토리를 만들어서 각각의 컴포넌트를 생성할 수 있습니다. 이렇게 하면 OS에 따라 코드를 변경할 필요가 없고, 새로운 OS가 추가되더라도 쉽게 확장할 수 있습니다.

 

Abstract Factory 패턴 예제

Diagrams

 

먼저, 추상 제품을 정의하는 인터페이스를 만듭니다.

 

public interface Button {
    void paint();
}

 

 

다음으로, 추상 제품의 구현체를 만듭니다.

 

public class MacOSButton implements Button {
    @Override
    public void paint() {
        System.out.println("Painting a MacOS button");
    }
}

public class WindowsButton implements Button {
    @Override
    public void paint() {
        System.out.println("Painting a Windows button");
    }
}

 

 

그 다음으로, 추상 팩토리를 정의하는 인터페이스를 만듭니다.

 

public interface GUIFactory {
    Button createButton();
}

 

 

구체적인 팩토리 클래스를 정의합니다.

 

public class MacOSFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new MacOSButton();
    }
}

public class WindowsFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new WindowsButton();
    }
}

 

 

클라이언트 코드에서는 추상 팩토리를 사용하여 구체적인 팩토리 객체를 생성하고, 해당 팩토리 객체에서 추상 제품을 생성합니다.

 

public class Application {
    private GUIFactory factory;

    public Application(GUIFactory factory) {
        this.factory = factory;
    }

    public void createUI() {
        Button button = factory.createButton();
        button.paint();
    }
}

public class Main {
    public static void main(String[] args) {
        Application app;
        GUIFactory factory;

        String osName = System.getProperty("os.name").toLowerCase();
        if (osName.contains("mac")) {
            factory = new MacOSFactory();
            app = new Application(factory);
        } else {
            factory = new WindowsFactory();
            app = new Application(factory);
        }

        app.createUI();
    }
}

 

위 코드에서, Main 클래스에서는 운영체제를 확인하여 MacOSFactory 또는 WindowsFactory를 생성합니다. 그리고 Application 클래스에서는 생성된 팩토리 객체에서 createButton 메서드를 호출하여 버튼 객체를 생성하고 paint 메서드를 호출하여 버튼을 그립니다.

반응형