Skip to content

서로 관련있는 여러 객체를 만들어주는 인터페이스를 만들어 구체적으로 어떤 클래스의 인스턴스를(concrete product)를 사용하는지 감추는 패턴이다.

구체적인 객체 생성 과정을 추상화한 인터페이스를 제공한다는 점에서 팩토리 메소드 패턴과 비슷하지만 팩토리 메소드 패턴은 구체적인 객체 생성 과정을 하위 또는 구체적인 클래스로 옮기는 것이 목적이고, 추상 팩토리 패턴은 관련있는 여러 객체를 구체적인 클래스에 의존하지 않고 만들 수 있게 해주는 것이 목적이라는 점에서 다르다.


예시 코드

@Getter
@Setter
@AllArgsConstructor
public abstract class Pizza {
private String name;
private Sauce sauce;
private Topping topping;
}
public class CheesePizza extends Pizza {
public CheesePizza(String name, Sauce sauce, Topping topping) {
super(name, sauce, topping);
}
}
public class PineapplePizza extends Pizza {
public PineapplePizza(String name, Sauce sauce, Topping topping) {
super(name, sauce, topping);
}
}

추상 클래스 Pizza와 그 클래스를 상속받은 CheesePizza, PineapplePizza가 있다. Pizza는 String형의 name, 그리고 Sauce와 Topping을 가지고 있다.


public interface Topping {}
@NoArgsConstructor
public class CheeseTopping implements Topping{}
@NoArgsConstructor
public class PineappleTopping implements Topping{}
public interface Sauce {}
@NoArgsConstructor
public class CheeseSauce implements Topping{}
@NoArgsConstructor
public class PineappleSauce implements Topping{}

Sauce와 Topping 클래스는 인터페이스이고, Topping은 CheeseTopping과 PineappleTopping을, Sauce는 CheeseSauce와 PineappleSauce를 자식으로 가지고 있다. 추가적인 메서드나 필드는 구현하지 않았다.


public interface PizzaIngredientFactory {
public Sauce createSauce();
public Topping createTopping();
}
public class CheesePizzaIngredientFactory implements PizzaIngredientFactory {
@Override
public Sauce createSauce() {
return new CheeseSauce();
}
@Override
public Topping createTopping() {
return new CheeseTopping();
}
}
public class PineapplePizzaIngredientFactory implements PizzaIngredientFactory {
@Override
public Sauce createSauce() {
return new PineappleSauce();
}
@Override
public Topping createTopping() {
return new PineappleTopping();
}
}

그리고 피자의 재료를 준비해주는 PizzaIngredientFactory가 있다. 피자 종류별로 각각 소스와 토핑을 지정해준다.


public interface PizzaFactory {
public Pizza createPizza();
}
public class CheesePizzaIngredientFactory implements PizzaIngredientFactory {
@Override
public Sauce createSauce() {
return new CheeseSauce();
}
@Override
public Topping createTopping() {
return new CheeseTopping();
}
}
public class PineapplePizzaIngredientFactory implements PizzaIngredientFactory {
@Override
public Sauce createSauce() {
return new PineappleSauce();
}
@Override
public Topping createTopping() {
return new PineappleTopping();
}
}

PizzaIngredientFactory에서 넘어온 정보로 진짜 피자를 만드는 PizzaFactory가 있다. 이 PizzaFactory의 createPizza()메서드를 호출하면, 요청하는 클래스 입장에선 Pizza의 자식 클래스인 Sauce와 Topping에 대한 정보를 전혀 모르는 채로 Pizza를 생성할 수 있다.

링크로 가면 코드를 볼 수 있다.