Design Pattern with Java

3.추상 팩토리 패턴(Abstract Factory Pattern)

초코너무조코 2025. 1. 7. 12:48
728x90

추상 팩토리 패턴(Abstract Factory Pattern)은 관련 객체들의 군(군집)을 생성하는 데 사용되는 생성 패턴 중 하나입니다. 이 패턴은 상위 레벨에서 구체적인 클래스에 의존하지 않고, 관련 객체들을 그룹화하여 생성하는 인터페이스를 제공합니다.


추상 팩토리 패턴의 특징

  1. 객체 군의 생성: 관련된 객체들을 하나의 팩토리로 묶어 일관된 방식으로 생성합니다.
  2. 구현체 독립성: 구체적인 클래스에 의존하지 않고 인터페이스 또는 추상 클래스를 통해 객체를 생성합니다.
  3. 확장성: 새로운 제품군이 추가될 때 기존 코드에 영향을 최소화합니다.

사용 시점

  • 서로 관련된 객체들이 같이 사용되어야 할 때.
  • 시스템이 구체적인 클래스에 의존하지 않고, 상위 수준의 인터페이스를 사용해야 할 때.
  • 객체를 생성하는 구체적인 코드와 클라이언트 코드의 결합도를 낮추고 싶을 때.

추상 팩토리 패턴 구조

주요 구성 요소

  1. AbstractFactory: 제품군을 생성하는 인터페이스 또는 추상 클래스.
  2. ConcreteFactory: AbstractFactory의 구체적인 구현체로, 실제 제품을 생성합니다.
  3. AbstractProduct: 생성할 제품의 인터페이스 또는 추상 클래스.
  4. ConcreteProduct: AbstractProduct의 구체적인 구현체로, 팩토리가 생성하는 실제 객체입니다.
  5. Client: 팩토리를 사용하여 객체를 생성하고 사용하는 코드.

자바에서의 구현

1. AbstractProduct 정의

// 제품 A 인터페이스
public interface ProductA {
    void useA();
}

// 제품 B 인터페이스
public interface ProductB {
    void useB();
}

2. ConcreteProduct 정의

// 구체적인 제품 A1
public class ProductA1 implements ProductA {
    @Override
    public void useA() {
        System.out.println("사용 중: ProductA1");
    }
}

// 구체적인 제품 A2
public class ProductA2 implements ProductA {
    @Override
    public void useA() {
        System.out.println("사용 중: ProductA2");
    }
}

// 구체적인 제품 B1
public class ProductB1 implements ProductB {
    @Override
    public void useB() {
        System.out.println("사용 중: ProductB1");
    }
}

// 구체적인 제품 B2
public class ProductB2 implements ProductB {
    @Override
    public void useB() {
        System.out.println("사용 중: ProductB2");
    }
}

3. AbstractFactory 정의

public interface AbstractFactory {
    ProductA createProductA();
    ProductB createProductB();
}

4. ConcreteFactory 정의

// 구체적인 팩토리 1
public class Factory1 implements AbstractFactory {
    @Override
    public ProductA createProductA() {
        return new ProductA1();
    }

    @Override
    public ProductB createProductB() {
        return new ProductB1();
    }
}

// 구체적인 팩토리 2
public class Factory2 implements AbstractFactory {
    @Override
    public ProductA createProductA() {
        return new ProductA2();
    }

    @Override
    public ProductB createProductB() {
        return new ProductB2();
    }
}

5. Client 코드

public class AbstractFactoryPatternDemo {
    public static void main(String[] args) {
        // 팩토리 1 사용
        AbstractFactory factory1 = new Factory1();
        ProductA productA1 = factory1.createProductA();
        ProductB productB1 = factory1.createProductB();
        productA1.useA();
        productB1.useB();

        // 팩토리 2 사용
        AbstractFactory factory2 = new Factory2();
        ProductA productA2 = factory2.createProductA();
        ProductB productB2 = factory2.createProductB();
        productA2.useA();
        productB2.useB();
    }
}

출력:

사용 중: ProductA1
사용 중: ProductB1
사용 중: ProductA2
사용 중: ProductB2

장단점

장점

  1. 객체 생성 로직 분리: 클라이언트는 구체적인 객체 생성 로직을 알 필요가 없습니다.
  2. 일관성 유지: 관련된 객체들을 그룹화하여 일관된 인터페이스로 생성합니다.
  3. 확장성: 새로운 팩토리나 제품군을 추가하기 쉽습니다.

단점

  1. 복잡성 증가: 클래스와 인터페이스의 수가 늘어나 코드가 복잡해질 수 있습니다.
  2. 유연성 제한: 팩토리가 고정된 제품군을 생성하므로, 동적으로 다른 제품군을 조합하기 어렵습니다.

결론

추상 팩토리 패턴은 객체 생성과 관련된 코드의 결합도를 낮추고, 관련된 객체들을 그룹화하여 관리할 수 있는 강력한 디자인 패턴입니다. 특히, 여러 제품군이 존재하고 이들을 일관되게 생성해야 하는 상황에서 유용합니다. 하지만 코드 복잡도가 증가할 수 있으므로, 설계 요구 사항에 따라 신중히 적용해야 합니다.

728x90