의도
구체적인 서브클래스를 정의하지 않고 서로 관련있거나 의존적인 객체들을 생성하기 위한 인터페이스를 제공한다.
활용성
- 
객체가 생성·구성·표현되는 것에 독립적이어야 할 때 
- 
여러 제품군 중 하나를 선택해서 시스템을 설정해야 하고 한번 구성한 제품을 대른 것으로 대체할 수 있을 때 
- 
관련 객체들이 함께 사용되도록 설계되었고, 제약조건이 외부에서도 지켜지도록 하고 싶을 때 
- 
클래스 라이브러리는 제공하기를 원하고, 구현체가 아닌 인터페이스만 노출시키고 싶을 때 
구조
 
참여자
- 
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();
    }
}