Design Patterns

[Design Patterns] Abstract Factory

우라릭 2024. 1. 15. 21:37

목차

     

    개요

    이번 글에선 Object Creational Pattern인 추상 팩토리 패턴을 알아보겠습니다.

    내용

    요약

    추상 팩토리 패턴은 같은 기능을 제공하는 다른 구현체들을 사용하고 싶을 때 사용합니다. 클라이언트에게 Concrete class 대신 인터페이스를 제공하자!

    예시

    객체지향 프로그래밍을 이용해서 웹 프론트엔드 디자인을 한다고 생각해봅시다. 대부분은 디자인 라이브러리를 사용해서 개발할 것입니다. Material, NextUI, Bootstrap 등등.. 하지만 이런 라이브러리를 직접적으로 사용한다면 나중에 다른 라이브러리로 변경하는 것이 어려워집니다. 이럴 때 추상 팩토리 패턴을 사용할 수 있습니다. 시스템에 아래와 같은 클래스를 제공한다고 생각해봅시다.

    버튼을 만들고 싶으면 componentFactory.getButton()으로 버튼을 만들면 됩니다. 이제 개발자는 이 팩토리 클래스를 이용해 컴포넌트를 만듦으로써 웹의 look and feel을 고려할 필요가 없습니다.

    구조

    이 패턴은 크게 AbstractFactory, ConcreteFactory, AbstractProduct 3가지 구성요소를 가집니다. 

    위 예시를 예로 들면, ConcreteFactory1, 2는 각각 MaterialComponentFactory, NextUIConponentFactory가 될테고 AbstractProductA는 Button, ProductA1, ProductA2는 각각 MaterialButton, NextUIButton이 될 것입니다.

     

    이야깃거리

    언제 써야 할까?

    • 시스템이 객체의 생성과 독립적이어야 할 때
    • 시스템이 여러 family의 제품들을 같이 써야 할 때 (위 예시에선 Material, NextUI, Bootstrap)

    장단점

    • (장점) 시스템이 concrete 클래스를 자세히 알 필요가 없다.
    • (장점) 구현체를 쉽게 바꿀 수 있게 해준다. 한 곳에서 객체 생성을 담당하므로 바꾸기 쉽다.
    • (단점) 코드가 복잡해진다.

    Case Study

    1. Java XML Parser

    javax 패키지에선 XML을 파싱해서 DOM을 반환해주는 API가 있다. 해당 인터페이스는 DocumentBuilder이며 이 인터페이스의 구현체를 가지는 방법으로 추상 팩토리 패턴을 제공한다.

    기본 구현으로 com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl 을 제공한다. 즉 DocumentBuilderFactory.newInstance()를 호출하면 위의 기본 구현체를 제공한다. 하지만 또다른 DocumentBuilderFactory concrete class를 만들고 newInstance(className, classLoader)를 호출하면 또다른 Factory concrete class를 제공받을 수 있게 할 수 있다.

    2. Java Preference

    java.util.prefs 패키지에는 Preferences라는 클래스가 있다. 이 클래스는 시스템의 환경설정 데이터 등을 저장하고 가져올 수 있게 해준다. 그리고 이 Preferences를 가져올 수 있는 PreferencesFactory는 추상 팩토리 패턴의 전형적인 예로 볼 수 있다.

     

    출처

    GoF's Design Patterns

    외 등등