// lab
추상팩토리 — 팩토리메소드와 무엇이 다른가
- GoF 생성 패턴 정리 — 구상 클래스를 지정하지 않고 관련 객체들의 모음을 생성하는 방식
- 팩토리메소드와 자주 헷갈려서, 두 패턴의 경계를 정리하는 것이 목적
- 결론부터: 팩토리메소드는 메소드 레벨, 추상팩토리는 클래스 레벨
무엇을 캡슐화하는가
- 호출부가
new ConcreteA()를 직접 부르면 구상 클래스에 묶임 — 교체하려면 호출부를 전부 고쳐야 함 - 생성을 팩토리 뒤로 옮기면 호출부는 인터페이스만 알게 됨
- 추상팩토리는 여기서 한 걸음 더 — 서로 연관된 제품들을 한 벌로 생성
interface UIFactory {
createButton(): Button; // 연관된 제품 A
createInput(): Input; // 연관된 제품 B
}
class LightFactory implements UIFactory {
createButton() { return new LightButton(); }
createInput() { return new LightInput(); }
}
// 호출부는 어느 팩토리인지 모름 — 한 벌이 섞이지 않는 것이 보장됨
function render(factory: UIFactory) {
factory.createButton();
factory.createInput();
}팩토리메소드와의 경계
| 팩토리메소드 | 추상팩토리 | |
|---|---|---|
| 단위 | 메소드 | 클래스 |
| 생성 대상 | 제품 하나 | 연관된 제품 여러 개 |
| 확장 방법 | 서브클래스에서 메소드 오버라이드 | 새 팩토리 클래스 추가 |
- 제품이 하나면 팩토리메소드로 충분
- 제품들이 서로 짝을 이뤄야 할 때 추상팩토리가 값을 함 — 한 팩토리에서 뽑으면 섞일 수 없음
정리
- 확장 비용이 낮음 — 새 조합이 필요하면 팩토리 클래스 하나만 추가, 기존 호출부는 그대로
- 대가는 클래스 수 증가. 제품군이 하나뿐이면 과한 구조가 됨