~/csslab.dev/notes $ ls

// 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();
}

팩토리메소드와의 경계

팩토리메소드추상팩토리
단위메소드클래스
생성 대상제품 하나연관된 제품 여러 개
확장 방법서브클래스에서 메소드 오버라이드새 팩토리 클래스 추가
  • 제품이 하나면 팩토리메소드로 충분
  • 제품들이 서로 짝을 이뤄야 할 때 추상팩토리가 값을 함 — 한 팩토리에서 뽑으면 섞일 수 없음

정리

  • 확장 비용이 낮음 — 새 조합이 필요하면 팩토리 클래스 하나만 추가, 기존 호출부는 그대로
  • 대가는 클래스 수 증가. 제품군이 하나뿐이면 과한 구조가 됨