# 팩토리 패턴
☕ 팩토리 패턴이 뭐길래?
오늘은 팩토리 패턴(Factory Pattern)에 대해 공부해봤다. 이게 디자인 패턴 중 하나라고 하는데, 정확히 뭐 하는 걸까?
🎭 팩토리 패턴이란?
팩토리 패턴은 객체 생성의 책임을 상위 클래스(또는 인터페이스)와 하위 클래스가 분리하도록 설계하는 패턴이다.
쉽게 말해서, 상위 클래스에서는 객체의 생성 방법을 몰라도 되고, 하위 클래스에서만 구체적인 생성 로직을 관리하는 방식이라고 보면 된다.
이를 통해 얻을 수 있는 장점은?
- 상위 클래스는 객체 생성 방식에 대해 몰라도 되니까, 코드가 더 유연해진다! 🎉
- 객체 생성 로직이 한 곳(팩토리)에서 관리되니까 유지보수가 편하다! 🔧
그렇다면 실제 코드에서는 어떻게 적용될까?
☕ 커피 공장에서 배우는 팩토리 패턴
팩토리 패턴을 이해하기 위해, 커피 공장(coffeeFactory)을 예로 들어보자.
이 공장에서는 라떼(Latte)와 에스프레소(Espresso)를 만들 수 있다고 하자.
그러면 공장은 이렇게 설계할 수 있을 것 같다.
🎨 1. 커피의 공통적인 특징을 가진 추상 클래스
abstract class Coffee {
abstract void brew(); // 각 커피마다 다른 방식으로 만들어질 예정
}
모든 커피는 brew()
라는 공통된 기능을 가질 거니까, 추상 클래스로 정의했다.
이제 Latte
와 Espresso
를 만들어보자.
☕ 2. 구체적인 커피 클래스
class Latte extends Coffee {
@Override
void brew() {
System.out.println("라떼를 만들고 있습니다. 우유 추가~ 🥛");
}
}
class Espresso extends Coffee {
@Override
void brew() {
System.out.println("에스프레소를 만들고 있습니다. 진하게 추출 중... ☕");
}
}
각 클래스에서 brew()
를 다르게 구현했다.
이제 본격적으로 팩토리 패턴의 핵심! 공장(Factory) 클래스를 만들어보자.
🏭 3. 커피를 만들어주는 공장 (팩토리 클래스)
class CoffeeFactory {
public static Coffee createCoffee(String type) {
if (type.equalsIgnoreCase("latte")) {
return new Latte();
} else if (type.equalsIgnoreCase("espresso")) {
return new Espresso();
} else {
throw new IllegalArgumentException("알 수 없는 커피 종류입니다: " + type);
}
}
}
여기서 중요한 점은 팩토리 클래스(CoffeeFactory)가 객체 생성의 책임을 지고 있다는 것!
클라이언트 코드에서는 new Latte()
나 new Espresso()
를 직접 호출하지 않고,CoffeeFactory.createCoffee("latte")
같은 방식으로 객체를 생성하게 된다.
🚀 4. 클라이언트 코드 (팩토리 패턴 사용 예시)
public class Main {
public static void main(String[] args) {
Coffee latte = CoffeeFactory.createCoffee("latte");
latte.brew(); // "라떼를 만들고 있습니다. 우유 추가~ 🥛" 출력
Coffee espresso = CoffeeFactory.createCoffee("espresso");
espresso.brew(); // "에스프레소를 만들고 있습니다. 진하게 추출 중... ☕" 출력
}
}
와! 🎉
팩토리 패턴 덕분에 Main
클래스에서는 구체적인 객체 생성 방식에 대해 신경 쓰지 않아도 된다!
그냥 CoffeeFactory.createCoffee("espresso")
라고만 하면 알아서 에스프레소 객체가 생성된다.
🎯 팩토리 패턴을 써야 하는 이유?
팩토리 패턴을 사용하면 코드가 더 깔끔하고 유지보수하기 쉬워진다.
- 새로운 커피 종류(예: 아메리카노, 카푸치노 등)를 추가할 때,
CoffeeFactory
클래스만 수정하면 된다. - 객체 생성 로직이 한 곳(팩토리)에 모여 있어서, 코드 관리가 더 편해진다.
하지만 궁금한 점이 하나 생겼다... 🤔
"팩토리 메서드를 사용할 때, new
를 직접 쓰는 것보다 무조건 좋은 걸까?"
아마 작은 프로젝트에서는 그냥 new
를 사용하는 게 더 간단할 수도 있다.
하지만 객체 생성 과정이 복잡하거나, 확장이 필요한 경우라면 팩토리 패턴이 확실히 유용할 것 같다.
📌 결론: 팩토리 패턴은 언제 써야 할까?
- 객체 생성 로직을 한 곳에서 관리하고 싶을 때
- 코드의 유연성과 유지보수성을 높이고 싶을 때
- 새로운 객체를 추가할 가능성이 높을 때
물론 너무 단순한 경우에는 굳이 팩토리 패턴을 사용할 필요가 없을 수도 있다.
하지만 확장성을 고려할 때, 팩토리 패턴을 익혀두면 유용할 것 같다! 😊