객체를 생성하는 인터페이스는 미리 정의하되, 인스턴스를 만들 클래스의 결정은 서브 클래스쪽에서 내리는 패턴이다.
즉, 여러 개의 서브 클래스를 가진 슈퍼 클래스가 있을때, 인풋에 따라 하나의 자식 클래스의 인스턴스를 리턴해주는 방식.
객체 생성과 클래스 구현을 나눠 상호 의존도를 줄인다.
생성 패턴 중 하나다.
생성 패턴: 인스턴스를 만드는 절차를 추상화하는 패턴
class Animal {
void speak(){}
}
class Dog extends Animal{
void speak(){
System.out.println("멍멍");
}
}
class Cat extends Animal{
void speak(){
System.out.println("야옹");
}
}
class AnimalFactory{
public Animal getAnimal(String animalType) {
if(animalType.equalsIgnoreCase("CAT")) {
return new Cat();
} else if(animalType.equalsIgnoreCase("DOG")) {
return new Dog();
}
return null;
}
}
public class Main {
public static void main(String[] args) {
AnimalFactory animalFactory = new AnimalFactory();
Animal animal1 = animalFactory.getAnimal("CAT");
Animal animal2 = animalFactory.getAnimal("DOG");
animal1.speak(); // 야옹
animal2.speak(); // 멍멍
}
}
서로 관련이 있는 객체들을 통째로 묶어서 팩토리 클래스로 만들고, 이를 조건에 따라 생성하도록 다시 팩토리를 만들어서 객체를 생성한다.
추상 팩토리 패턴에서는 팩토리 클래스에서 서브 클래스를 생성하는데에 있어 if-else문을 걷어낸다.
인풋으로 서브 클래스에 대한 식별 데이터를 받는 것이 아닌 또 하나의 팩토리 클래스를 받는다.