1. 개요

이 기사에서는 추상 팩토리 디자인 패턴에 대해 설명합니다.

Design Patterns: Elements of Reusable Object-Oriented Software라는에서는 Abstract Factory가 "구체적인 클래스를 지정하지 않고 관련 또는 종속 개체의 패밀리를 만들기 위한 인터페이스를 제공합니다"라고 말합니다. 즉, 이 모델을 사용하면 일반적인 패턴을 따르는 개체를 만들 수 있습니다.

JDK의 Abstract Factory 디자인 패턴의 예는 javax.xml.parsers.DocumentBuilderFactory 클래스  의 newInstance() 입니다 .

2. 추상적인 팩토리 디자인 패턴 예제

이 예제에서는 Factory Method Design 패턴의 두 가지 구현인 AnimalFactoryColor Factory를 만듭니다 .

그런 다음 Abstract Factory AbstractFactory를 사용하여 액세스를 관리합니다 .

업데이트된 추상 Factory

먼저 Animal 클래스 의 패밀리를 만들고 나중에 Abstract Factory에서 사용할 것입니다.

Animal 인터페이스는 다음과 같습니다 .

public interface Animal {
    String getAnimal();
    String makeSound();
}

구체적인 구현 Duck :

public class Duck implements Animal {

    @Override
    public String getAnimal() {
        return "Duck";
    }

    @Override
    public String makeSound() {
        return "Squeks";
    }
}

게다가 우리는 이러한 방식으로 정확히 Animal 인터페이스( Dog, Bear 등)의 보다 구체적인 구현을 만들 수 있습니다.

추상 팩토리는 종속 객체의 패밀리를 처리합니다. 이를 염두에 두고 몇 가지 구현( 흰색, 갈색,… ) 이 있는 인터페이스로 Color 제품군을 하나 더 소개할 것입니다 .

지금은 실제 코드를 건너뛰지만 여기에서 찾을 수 있습니다 .

이제 여러 패밀리가 준비되었으므로 이들을 위한 AbstractFactory 인터페이스를 만들 수 있습니다.

public interface AbstractFactory<T> {
    T create(String animalType) ;
}

다음으로 이전 섹션에서 논의한 Factory Method 디자인 패턴을 사용하여 AnimalFactory 를 구현합니다 .

public class AnimalFactory implements AbstractFactory<Animal> {

    @Override
    public Animal create(String animalType) {
        if ("Dog".equalsIgnoreCase(animalType)) {
            return new Dog();
        } else if ("Duck".equalsIgnoreCase(animalType)) {
            return new Duck();
        }

        return null;
    }

}

마찬가지로 동일한 디자인 패턴을 사용하여 Color 인터페이스 에 대한 팩터리를 구현할 수 있습니다 .

이 모든 것이 설정되면 getFactory() 메서드 에 제공하는 인수에 따라 AnimalFactory 또는 ColorFactory 구현을 제공하는 FactoryProvider 클래스를 생성합니다 .

public class FactoryProvider {
    public static AbstractFactory getFactory(String choice){
        
        if("Animal".equalsIgnoreCase(choice)){
            return new AnimalFactory();
        }
        else if("Color".equalsIgnoreCase(choice)){
            return new ColorFactory();
        }
        
        return null;
    }
}

3. 추상 팩토리 패턴을 사용하는 경우:

  • 클라이언트는 시스템에서 개체를 생성하고 구성하는 방법과 무관합니다.
  • 시스템은 여러 개체군으로 구성되며 이러한 개체군은 함께 사용하도록 설계되었습니다.
  • 특정 의존성을 구성하려면 런타임 값이 필요합니다.

미리 정의된 개체를 만들 때 패턴이 훌륭하지만 새 개체를 추가하는 것은 어려울 수 있습니다 . 새로운 유형의 개체를 지원하려면 AbstractFactory 클래스와 모든 하위 클래스를 변경해야 합니다.

4. 요약

이번 글에서는 Abstract Factory 디자인 패턴에 대해 알아보았습니다.

마지막으로 항상 그렇듯이 이러한 예제의 구현은  GitHub 에서 찾을 수 있습니다 .

Generic footer banner