본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

추상 팩토리 패턴(Abstract Factory Pattern)은 서로 연관되거나 함께 쓰여야 하는 객체들의 묶음(제품군)을, 그 구체 클래스를 지정하지 않고 하나의 팩토리 인터페이스를 통해 만들도록 하는 생성 패턴이다.

추상 팩토리 패턴은 GoF 디자인 패턴의 생성(Creational) 패턴 다섯 가지(팩토리 메서드, 추상 팩토리, 빌더, 프로토타입, 싱글톤) 가운데 하나다. 키트(Kit) 패턴이라고도 한다.

화면 부품을 예로 들면, 윈도우 모양의 버튼·체크박스·창은 함께 쓰여야 하고 맥 모양 부품과 섞이면 안 된다. 클라이언트 코드가 new WindowsButton(), new MacCheckbox() 처럼 구체 클래스를 직접 만들면 제품군이 섞일 수 있고, 테마를 바꿀 때 코드 곳곳을 고쳐야 한다. 추상 팩토리 패턴은 "버튼을 만든다, 체크박스를 만든다" 는 생성 메서드를 한 인터페이스(추상 팩토리)에 모으고, 제품군마다 그 인터페이스를 구현한 구체 팩토리를 하나씩 둔다. 클라이언트는 어떤 구체 팩토리를 받았는지 모른 채 추상 타입으로만 객체를 만들고 쓰므로, 구체 팩토리 하나만 바꿔 끼우면 연관된 제품 전체가 한 번에 교체된다.

참여자 역할
AbstractFactory 제품군의 각 제품을 만드는 생성 메서드(createButton, createCheckbox 등)를 선언한 인터페이스
ConcreteFactory 한 제품군의 구체 제품을 만들어 돌려주는 팩토리(WindowsFactory, MacFactory)
AbstractProduct 제품 종류별 공통 인터페이스(Button, Checkbox)
ConcreteProduct 제품군별 실제 제품 클래스(WindowsButton, MacButton 등)
Client 추상 팩토리와 추상 제품 인터페이스만 사용한다
interface Button { void paint(); }
interface Checkbox { void paint(); }

interface GUIFactory {            // 추상 팩토리
    Button createButton();
    Checkbox createCheckbox();
}

class WindowsFactory implements GUIFactory {
    public Button createButton() { return new WindowsButton(); }
    public Checkbox createCheckbox() { return new WindowsCheckbox(); }
}

class MacFactory implements GUIFactory {
    public Button createButton() { return new MacButton(); }
    public Checkbox createCheckbox() { return new MacCheckbox(); }
}

class Application {
    private final Button button;
    private final Checkbox checkbox;
    Application(GUIFactory factory) {   // 어떤 팩토리인지 모른다
        button = factory.createButton();
        checkbox = factory.createCheckbox();
    }
}

new Application(new MacFactory()) 로 바꾸기만 하면 버튼과 체크박스가 함께 맥 모양으로 바뀐다.

팩토리 메서드 패턴과 비교

편집 원본 편집
구분 팩토리 메서드 패턴 추상 팩토리 패턴
만드는 대상 제품 하나 서로 연관된 제품 여러 개(제품군)
핵심 수단 상속 - 하위 클래스가 생성 메서드를 재정의 객체 구성 - 팩토리 객체를 받아 그 객체에 생성을 맡김
교체 단위 생성 메서드 하나 팩토리 객체 하나(제품군 전체)

구체 팩토리의 각 생성 메서드는 팩토리 메서드로 구현되는 경우가 많고, 구체 팩토리는 하나만 있으면 되므로 싱글톤 패턴으로 만들기도 한다.

  • 장점
    • 클라이언트가 구체 제품 클래스에 의존하지 않는다(결합도가 낮아진다)
    • 한 제품군의 제품끼리만 함께 쓰이도록 보장한다
    • 제품군 전체를 팩토리 하나로 교체할 수 있다
  • 단점
    • 새 종류의 제품(예: 슬라이더)을 추가하려면 추상 팩토리 인터페이스와 모든 구체 팩토리를 고쳐야 한다
    • 인터페이스와 클래스 수가 많아진다

다른 분류의 패턴과 구별

편집 원본 편집

문제에 자주 함께 나오는 컴포지트·어댑터는 구조 패턴, 옵서버·상태는 행위 패턴이다. 생성 패턴은 팩토리 메서드, 추상 팩토리, 빌더, 프로토타입, 싱글톤 다섯 가지뿐이다.