[Design_Pattern] 팩토리 메서드 패턴(Factory Method Pattern)
안녕하세요 Limky입니다.
이번시간은 팩토리 메서드 패턴(Factory Method Pattern)에 대해서 알아보겠습니다.
팩토리 메서드 패턴(Factory Method Pattern)의 팩토리 메소드는 객체를 생성해서 반환하는 것을 말합니다. 즉 결과 값이 객체인 것입니다. 디자인 테이블과 예제를 보면서 바로 알아보겠습니다.
구체클래스는 인퍼페이스를 implements하지만, 저는 추상클래스로 구현 형식을 강제해보겠습니다. 예제에서는 추상클래스안에 추상메서드를 두었고, 구체클래스가 이를 재정의해서 구현하도록 설계했습니다.
먼저 Pizza라는 추상클래스를 두고 각 구체적인 토마토,페페로니 피자인 구체클래스들은 상속을 받아 각자의 스타일에 맞게 구현합니다. 마찬가지로 Factory 추상클래스를 만들고 상속을 받은 구체클래스 즉 팩토리 메서드를 가지고 있는 클래스인 PizzaFactory가 상속 재구현 합니다.
팩토리 메서드에 name매개변수를 받아 어떤 구체클래스의 객체를 반환할지 분기 처리 합니다.
아래 코드를 보면서 마무리 하겠습니다.
Pizza.java
public abstract class Pizza {
public abstract String getNmae();
}
TomatoPizza.java
public class TomatoPizza extends Pizza{
@Override
public String getNmae() {
return "TomatoPizza";
}
}
PepperoniPizza.java
public class PepperoniPizza extends Pizza{
@Override
public String getNmae() {
return "PepperoniPizza";
}
}
public abstract class Factory {
public abstract Pizza createPizza(String name);
}
public class PizzaFactory extends Factory{
@Override
public Pizza createPizza(String name) {
switch (name) {
case "Tomato": return new TomatoPizza();
case "Pepperoni":return new PepperoniPizza();
}
return null;
}
}
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
PizzaFactory pizzaFactory = new PizzaFactory();
Pizza pizza1 = pizzaFactory.createPizza("Tomato");
Pizza pizza2 = pizzaFactory.createPizza("Pepperoni");
System.out.println(pizza1.getNmae()+"\n");
System.out.println(pizza2.getNmae()+"\n");
}
}
*결과 값
TomatoPizza
PepperoniPizza
팩토리 메서드 패턴을 사용할 때 이점이 무엇이 있을까요?
바로 결합도를 낮춰서 얻을 수 있는 이점이라 보시면 됩니다. 클래스의 변경사항이 생겼을 때 얼마나 다른 클래스에게도 영향을 줄 것인가가 결합도인데 팩토리 메서드 패턴은 직접 사용하는 객체를 생성하지 않고 팩토리 메서트 클래스를 통해 객체를 대신 생성시키고 그 객체를 반환 받아 사용하기 때문에 효율적인 코드 제어를 할 수 있을 뿐더러 결합도를 낮춰 유지보수가 용이합니다.