개발자이야기
팩토리 메소드 패턴 (Factory method pattern) 본문
팩토리 메소드 패턴
팩토리 메소드 패턴이란 무엇일까?
우선 아래의 코드를 보도록 하겠습니다.
public class BurgerMain {
public static void main(String[] args) {
BurgerStore store = new BurgerStore();
CheeseBurger burger = store.order();
}
}
public class BurgerStore {
CheeseBurger order() {
return new CheeseBurger();
}
}
햄버거 가게에 햄버거 주문이 들어왔습니다. 그런데 버거를 주문해봤자 치즈버거만 제공해 줄 수 있는 상황입니다. 너무 극단적인 상황이죠.. 불고기 버거를 추가해 보겠습니다.
public class BurgerStore {
CheeseBurger order() {
return new CheeseBurger();
}
BulgogiBurger order2() {
return new BulgogiBurger();
}
}
자 이렇게 하나하나 추가하면 되겠군요! 버거의 종류가 많아지기 전까진 말이죠. 그리고 BurgerStore 와 각각의 Burger 클래스 간의 의존성이 너무 강하게 생겨버렸습니다.
위와 같은경우는 너무 극단적인 예시이긴 합니다.
자 이제 팩토리 메소드 패턴을 도입해 보겠습니다.
public interface Burger {
void burger();
}
public class CheeseBurger implements Burger {
@Override
public void burger() {
System.out.println("치즈버거");
}
}
각 햄버거 클래스 에는 Burger 인터페이스를 만들어 구현해주도록 했습니다.
public class BurgerFactory {
public Burger burger(String burgerType) {
switch (burgerType) {
case "치즈버거" : return new CheeseBurger();
case "불고기버거" : return new BulgogiBurger();
default: return new NormalBurger();
}
}
}
public class BurgerStore {
private BurgerFactory factory = new BurgerFactory();
Burger order(String burgerType) {
return factory.burger(burgerType);
}
}
public class BurgerMain {
public static void main(String[] args) {
BurgerStore store = new BurgerStore();
Burger burger = store.order("치즈버거");
burger.burger();
}
}
이제 BurgerStore 에서는 버거 타입을 전달받아 BurgerFactory 에서 버거를 받아오기만 하면 됩니다! 객체의 생성을 팩토리 메소드에 위임한 결과입니다.
하지만 사실 위의 예시같은 경우는 안쓰느니만 못한 코드처럼 보일 수 있습니다.
하지만 변할수 있는 것을 분리하여 캡슐화한 것만으로도 유연한 코드로 바뀌었다고 볼 수 있겠습니다.
틀린 부분은 언제든 피드백 환영하며 읽어주셔서 감사합니다.
'디자인패턴' 카테고리의 다른 글
디자인패턴 Adapter pattern (0) | 2021.09.02 |
---|---|
의존성 주입(dependency injection) (0) | 2021.06.17 |
추상팩토리 패턴 (Abstract-Factory Pattern) (0) | 2021.06.16 |
템플릿 메소드 (Template method) 패턴 (0) | 2021.06.09 |