255. 추상 팩토리 (Abstract Factory) - 구체적인 클래스 지정 없이 연관 객체군 생성 공장 그룹 테마 UI 생성 패턴 GoF

핵심 인사이트: (254번 팩토리 메서드의 초대형 업그레이드판) 254번 팩토리 메서드는 피자 '1개'를 굽는 공장이었다. 근데 이번엔 피자 1개가 아니라, 삼성 자동차 부품 10개(핸들, 바퀴, 엔진) 세트와 현대 자동차 부품 10개(핸들, 바퀴, 엔진) 세트를 찍어내야 한다! 만약 현대 바퀴에 삼성 엔진을 섞어 쓰면 차가 터져서 다 뒤진다! "야!! 낱개 부품 1개씩 찍어내는 조무래기 공장(팩토리 메서드) 10개를 굴리다간 부품이 섞여서 재앙이 터지잖아!! 당장 '핸들+바퀴+엔진'을 한 번에 세트로 무조건 묶어서 찍어내는 초거대 '세트 메뉴 팩토리(추상 팩토리)' 1개를 지어!! 그리고 [삼성 부품 세트 전용 공장]과 [현대 부품 세트 전용 공장]으로 딱 찢어서, 부품들이 지들끼리 섞이는 호환성 붕괴를 완벽하게 차단하면서 한 방에 조립 세트를 뱉어내게 만들어라!!" 단품이 아닌 연관된 '세트(군)' 객체들을 통째로 쏟아내는 거대 복합 공장, 추상 팩토리다.

Ⅰ. 낱개 생산의 호환성 대참사

  • 상황: 윈도우즈용 [버튼][스크롤바]를 만들고, 맥OS용 [버튼][스크롤바]를 만들어야 합니다.
  • 개발자가 new 윈도우버튼(), new 맥스크롤바() 로 코드를 막 짰습니다.
  • 재앙: 윈도우 화면에 실수로 맥OS용 스크롤바가 조립되어 화면이 깨지고 앱이 폭발합니다. 윈도우 부품은 무조건 윈도우 부품끼리만(연관된 객체군) 조합해야 살아남습니다.

Ⅱ. 추상 팩토리 (Abstract Factory)의 개념 🌟

  • 개념: GoF 생성 패턴 중 하나로, 구체적인 클래스의 이름을 명시하지 않고도 '서로 연관되거나 의존적인 여러 객체들의 묶음(군, Group / Family)'을 단 한 번의 호출로 안전하게 통째로 생성해 내는 '복합 공장용 인터페이스'를 제공하는 패턴입니다.

Ⅲ. 추상 팩토리의 거대한 뼈대 구조 🌟 핵심 🌟

254번 팩토리 메서드를 한 번에 여러 개 묶어놓은 꼴입니다.

  1. Abstract Factory (최상위 본사 껍데기):
    • 텅 빈 구멍 함수들을 모아놓은 인터페이스입니다. 근데 구멍이 1개가 아닙니다!
    • createButton(), createScrollbar() 이렇게 부품의 개수만큼 빈 구멍을 뚫어놓습니다.
  2. Concrete Factory (현대 공장, 삼성 공장):
    • 본사 껍데기를 상속받은 진짜 거대 공장들입니다.
    • WindowsFactory (자식 공장 1): 버튼 구멍에 new WinButton()을, 스크롤바 구멍에 new WinScrollbar()를 채워 넣어 오직 윈도우 세트만 무조건 세트로 찍어냅니다.
    • MacFactory (자식 공장 2): 버튼에 new MacButton()을, 스크롤바에 new MacScrollbar()를 꽂아 넣어 오직 맥 세트만 무조건 세트로 찍어냅니다.
  3. 클라이언트 (사용자):
    • "나 윈도우 테마 그려줘!" 하면 WindowsFactory 기계에 전원을 넣습니다. 그럼 윈도우 버튼과 스크롤바가 완벽하게 호환되는 한 세트로 툭 떨어져 화면이 예쁘게 조립됩니다. 맥OS 테마 버튼이 섞여 들어갈 확률은 0%입니다.

Ⅳ. 팩토리 메서드(254) vs 추상 팩토리(255) 차이점 🌟 무조건 암기 🌟

두 개가 미치도록 헷갈립니다. 이것만 외우면 끝납니다.

비교 항목254. 팩토리 메서드 (Factory Method)255. 추상 팩토리 (Abstract Factory)
초점 (타겟)1개의 객체(Product)를 어떻게 예쁘게 찍어낼까?여러 개의 관련된 **객체 세트(Family/군)**를 어떻게 통째로 찍어낼까?
생성의 위임자식 클래스(상속)가 오버라이딩해서 생성여러 공장 객체(조합)가 파츠별로 모아서 통째로 생성
비유'치킨'이라는 단일 메뉴를 굽는 하청 공장'치킨+콜라+감튀'를 호환성 맞춰서 내놓는 세트 메뉴 공장

📢 섹션 요약 비유: 추상 팩토리(Abstract Factory) 패턴은 가구점의 **'북유럽풍 인테리어 세트 판매 강제 규정'**과 같습니다. 손님이 이케아에서 침대는 북유럽풍 나무 침대(객체 1)를 사고, 책상은 번쩍거리는 사이버펑크 쇠 책상(객체 2)을 사 가면, 방의 인테리어(시스템 호환성)가 개박살 납니다. 이 부품 섞임의 대참사를 막기 위해 이케아 본사(Abstract Factory)는 단품 판매를 폐지합니다. 대신 **'북유럽풍 공장(Concrete Factory 1)'**과 **'사이버펑크 공장(Concrete Factory 2)'**을 짓습니다. 손님이 "북유럽 테마로 방 꾸며줘!"라고 본사에 요청하면, 본사는 구체적인 나무 침대 이름, 나무 책상 이름을 알 필요도 없이 북유럽풍 공장의 스위치를 누릅니다. 공장은 알아서 북유럽풍 침대, 책상, 옷장을 **완벽하게 짝이 맞는 세트(연관된 객체군)**로 찍어내어 통째로 배달합니다. 쇠 책상이 섞여 들어올 위험이 0%로 차단되어, 시스템 전체의 부품 호환성과 일관성을 철통같이 보장하는 거대 테마 공장 아키텍처입니다.