Documents

Abstract Factory Pattern

아래 책를 참고하여 학습한 내용을 정리/기록한 포스트입니다. 자세한 내용은 책을 참고하시기 바라며, 문제가 있을 경우 연락 부탁드립니다.

  • [GOF{kr}:132] - 추상 팩토리 메서드

  • GoF, 김정아(옮긴이), Design Patterns, 개정판, 프로텍미디어, 2015.

의도

구체적인 서브클래스를 정의하지 않고 서로 관련있거나 의존적인 객체들을 생성하기 위한 인터페이스를 제공한다.

활용성

  • 객체가 생성·구성·표현되는 것에 독립적이어야 할 때

  • 여러 제품군 중 하나를 선택해서 시스템을 설정해야 하고 한번 구성한 제품을 대른 것으로 대체할 수 있을 때

  • 관련 객체들이 함께 사용되도록 설계되었고, 제약조건이 외부에서도 지켜지도록 하고 싶을 때

  • 클래스 라이브러리는 제공하기를 원하고, 구현체가 아닌 인터페이스만 노출시키고 싶을 때

구조

Abstract Factory Pattern

참여자

  • AbstractFactory: 개념적 제품에 대한 객체를 생성하는 연산으로 인터페이스를 정의

  • ConcreteFactory: 구체적인 제품에 대한 객체를 생성하는 연산을 구현

  • AbstractProduct: 개념적 제품 객체에 대한 인터페이스를 정의

  • ConcreteProduct: 구체적으로 팩토리가 생성할 객체 정의

  • Client: AbstractFactory와 AbstractProduct 클래스에 선언된 인터페이스를 사용

결과

  • 구체적인 클래스 분리

  • 제품군을 쉽게 대체 가능

  • 제품 사이의 일관성 증진

  • 새로운 종류의 제품 제공하기 어려움

구현

예제

interface Contact {
    public
}

class PrivateContact extends Contact {}

class SharedContact extends Contact {}

class PrivateContactFactory extends ContactAbstractFactory {
    @Override
    public
}

enum ContactType {
    PRIVATE, SHARED
}

abstract class ContactAbstractFactory {
    private static final PRIVATE_CONTACT = new PrivateContactFactory();
    private static final SHARED_CONTACT = new SharedContactFactory();

    static ContactAbstractFactory getFactory(ContactType type) {
        switch (type) {
            case PRIVATE:
                return PRIVATE_CONTACT;
            case SHARED:
                return SHARED_CONTACT;
            default:
                return null;
        }
    }

    public abstract {}
}

public class Client {
    public static void main(String[] args) {
        ContactAbstractFactory factory = ContactAbstractFactory.getFactory(ContactType.PRIVATE);
        Contact contact = factory.newContact();
    }
}
java,oop,design pattern,creational pattern