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

참여자
-
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();
}
}