개념
구체적인 클래스를 지정하지 않고 관련성을 갖는 객체들의 집합을 생성하거나 서로 독립적인 객체들의 집합을 생성 할 수 있는 인터페이스를 제공하는 패턴
다른 이름
키트
추상 팩 토리는 언제 사용할까?
- 객체가 생성되거나, 구성. 표현되는 방식과 무관하게 시스템을 독립적으로 만들자고 할 때
- 여러 제품 군 중 하나를 선택해서 시스템을 설정해야 하고, 한번 구성한 제품을 다른 것으로 대체 할 수 있을 때
- 관련된 제품 객체들이 함께 사용되도록 설계되었고, 이 부분에 대한 제약이 외부에도 지켜지도록 하고 싶을 때
- 제품에 대한 클래스 라이브러리를 제공하고, 그들의 구현이 아닌 인터페이스를 노출 시키시고 싶을 때
구성 요소
- Abstract Factory: 개념적 제품에 대한 객체를 생성하는 연산으로 인터페이스를 정의.
- Concrete Factory: 구체적으로 팩 토리가 생성할 객체를 정의하고, Abstract Product가 정의하는 인터페이스 구현.
Abstract Product: 개념적 제 품 객체에 대한 인터페이스를 정의합니다
Concrete Product : 구체적으로 팩토리가 생성할 객체를 정의하고, Abstract Product가 정의하는 인터페이스를 구현합니다.
Client: Abstract Factory, Abstract Product클래스에 선언된 인터페이스 사용
추상 팩 토리의 장 단점
- 구체적인 클래스를 분리한다..
- 제품 군을 쉽게 대체 할 수 있다.
- 제품 사이의 일관성을 증진 시킨다.
- 새로운 종류의 제품을 제공하기 어렵다.
Abstract factory vs factory method pattern
Example
public interface AbstractFactory {
AbstractProductA createProductA();
AbstractProductB createProductB();
}
public interface AbstractProductA {
void print();
}
public interface AbstractProductB {
void print();
}
public class ProductA1 implements AbstractProductA {
@Override
public void print() {
System.out.println("productA1");
}
}
public class ProductA2 implements AbstractProductA {
@Override
public void print() {
System.out.println("productA2");
}
}
public class ProductB1 implements AbstractProductB {
@Override
public void print() {
System.out.println("productB1");
}
}
public class ProductB2 implements AbstractProductB {
@Override
public void print() {
System.out.println("productB2");
}
}
public class ConcreteFactory1 implements AbstractFactory{
@Override
public AbstractProductA createProductA() {
return new ProductA1();
}
@Override
public AbstractProductB createProductB() {
return new ProductB1();
}
}
public class ConcreteFactory2 implements AbstractFactory{
@Override
public AbstractProductA createProductA() {
return new ProductA2();
}
@Override
public AbstractProductB createProductB() {
return new ProductB2();
}
}
public class Client {
public static void main(String[] args) {
AbstractFactory factory = new ConcreteFactory1();
factory.createProductA().print();
factory.createProductB().print();
System.out.println();
factory = new ConcreteFactory2();
factory.createProductA().print();
factory.createProductB().print();
}
}
- interface가 아닌 abstract 클래스 사용 가능하다.
출처 : Gof의 디자인 패턴