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