구체적인 클래스에 의존하지 않고 서로 연관되거나 의존적인 객체들의 조합을 만드는 인터페이스를 제공하는 패턴
개인적으로 이해가 가장 잘 되는 피자를 들고 왔습니다.
피자 스타일(America, Seoul 버전)에 따른 도우와 소스 객체를 생성하는 추상 팩토리입니다.
public interface PizzaFactory{
public Dough CreateDough();
public Source CreateSource();
public Pizza CreatePizza();
}
public class AmericaPizzaFactory implements PizzaFactory{
public Dough CreateDough(){
return new WheatDough();
}
public Source CreateSource(){
return new SweetChiliSource();
}
public Pizza CreatePizza(){
return new AmericaPizza();
}
}
public class SeoulPizzaFactory implements PizzaFactory{
public Dough CreateDough(){
return new GreenTeaDough();
}
public Source CreateSource(){
return new HotChiliSource();
}
public Pizza CreatePizza(){
return new SeoulPizza();
}
}
// 피자 가게
public class AmericanPizzaStore extends PizzaStore{
PizzaFactory pizzaFactory = new AmericaPizzaFactory();
public Pizza getPizza(){
return new AmericaPizza(pizzaFactory);
}
}
public class SeoulPizzaStore extends PizzaStore{
PizzaFactory pizzaFactory = new SeoulPizzaFactory();
public Pizza getPizza(){
return new SeoulPizza(pizzaFactory);
}
}
// 피자 클래스
public class Pizza{
private Dough dough;
private Source source;
private PizzaFactory pizzaFactory;
public Pizza(PizzaFactory pizzaFactory){
this.pizzaFactory = pizzaFactory;
this.dough = pizzaFactory.getDough();
this.source = pizzaFactory.getSource();
}
}
// 피자 클래스 (구체)
public class AmericaPizza extends Pizza{
public AmericaPizza(PizzaFactory pizzaFactory) {
super(pizzaFactory);
}
}
public class SeoulPizza extends Pizza{
public SeoulPizza(PizzaFactory pizzaFactory) {
super(pizzaFactory);
}
}
클라이언트에서 어떤 팩토리를 이용하는지는 실행 단계에서 결정됩니다.
여기까지의 다이어그램을 보면 다음과 같습니다.
둘의 다이어그램을 같이 보며 비교해보겠습니다.
추상 팩토리 패턴은 연관된 객체들의 집합을 형성할 때 이용하는 디자인 패턴입니다.
객체들의 집합을 추상화하고 클라이언트에게 추상화된 인터페이스를 제공합니다. 이렇게 하면 클라이언트는 일관되게 객체를 전달 받아 사용할 수 있게 됩니다.
추상 팩토리는 인스턴스의 생성을 서브클래스에게 위임함으로써 의존성을 낮춥니다.
객체 생성을 캡슐화 하여 객체 간 느슨한 결합 관계를 만들고 특정 구현에 의존하지 않는 설계를 할 수 있습니다.
감사합니다.
Text by Chaelin. Photographs by Chaelin, Unsplash.