비슷한 객체를 공장에서(팩토리) 찍어내듯이 반복적으로 생성할 수 있게 하는 패턴을 말한다.
아래의 예제를 살펴보자
const cafeOrder = type => {
let orderItem;
if (type === 'coffee') {
orderItem = new CoffeeOrder();
} else if (type === 'bread') {
orderItem = new BreadOrder();
} else if (type === 'juice') {
orderItem = new JuiceOrder();
}
orderItem.make();
orderItem.box();
return orderItem;
};
이와같은 코드가 있다고 가정해보자.
주문이 들어오는 type에 따라 orderItem을 생성하고, 만들고(make), 포장하고(box) 고객에게 돌려주는(return) 간단한 코드이다.
하지만 위 코드는 구상 클래스로 구현되어있어 커피가게가 커져서 type이 더 추가되었을 때 코드변화에 대응하기 안좋은 코드이다.
즉 변화에 닫힌코드 라고 할 수 있다.
코드를 구현할 때에는 변하는 부분과 변하지 않는 부분을 분리해야한다.
위 코드에서 변하는 부분은 어디일까.
이렇게 고쳐보자
const cafeOrder = type => {
let orderItem = createOrderItem(type);
orderItem.make();
orderItem.box();
return orderItem;
};
const createOrderItem = type => {
let orderItem;
if (type === 'coffee') {
orderItem = new CoffeeOrder();
} else if (type === 'bread') {
orderItem = new BreadOrder();
} else if (type === 'juice') {
orderItem = new JuiceOrder();
}
return orderItem;
}
createOrderItem
함수를 추가하여 변하는 코드를 분리했다.
쉬운 예제를 통해 팩토리패턴에 대해 살펴보았다.
추상된 것에 의존하도록 만들어야한다. 구상된 것에 의존하며 안된다