팩토리 패턴

기술노트

🏭 팩토리 패턴 (Factory Pattern)

팩토리 패턴은 객체 지향 디자인 패턴 중 하나로, 객체를 생성하는 과정을 캡슐화하여, 클라이언트가 구체적인 클래스 타입을 직접 알지 못해도 객체를 생성할 수 있도록 하는 패턴입니다. 마치 공장(Factory)에서 제품을 찍어내듯이, 팩토리 클래스가 객체 생성을 전담합니다.

이를 통해 클라이언트 코드와 객체 생성 코드 사이의 결합도(Coupling)를 낮출 수 있습니다.


🤔 팩토리 패턴은 왜 사용하는가?

만약 클라이언트 코드에서 `new Car()` 와 같이 구체적인 클래스 이름을 사용하여 객체를 직접 생성하면, 나중에 자동차의 종류가 `Truck`으로 바뀌었을 때 클라이언트 코드 전체를 수정해야 하는 문제가 발생합니다. (`new Truck()`)

팩토리 패턴은 객체 생성에 필요한 모든 로직을 팩토리 클래스에 위임합니다. 클라이언트는 오직 팩토리에 "자동차를 만들어줘"라고 요청만 하면 되고, 어떤 종류의 자동차를 만들지는 팩토리가 결정합니다. 따라서 나중에 새로운 종류의 자동차가 추가되더라도 클라이언트 코드는 전혀 수정할 필요가 없습니다.


📚 팩토리 패턴의 종류

팩토리 패턴은 보통 두 가지 형태로 나뉩니다.

  • 팩토리 메서드 패턴 (Factory Method Pattern)

> * 객체를 생성하는 인터페이스를 부모 클래스에 정의하고, 실제로 어떤 객체를 생성할지는 자식 클래스가 결정하도록 하는 패턴입니다. > * 상속을 통해 객체 생성 로직을 자식 클래스에 위임하는 구조입니다.

  • 추상 팩토리 패턴 (Abstract Factory Pattern)

> * 서로 관련 있는 객체들의 집합을 생성하는 인터페이스를 제공하는 패턴입니다. 팩토리의 팩토리라고도 불립니다. > * 예를 들어, 'UI 팩토리'라는 추상 팩토리는 '버튼', '체크박스' 등 관련 있는 UI 요소들을 함께 생성하는 역할을 합니다. `WindowsUIFactory`는 윈도우 스타일의 버튼과 체크박스를, `MacUIFactory`는 맥 스타일의 버튼과 체크박스를 생성합니다.


💡 개발자 핵심 Point

  • 팩토리 패턴은 객체 생성의 책임을 분리하여 코드의 유연성과 확장성을 높이는 데 목적이 있습니다.
  • 생성해야 할 객체의 종류가 자주 바뀌거나, 어떤 객체를 생성해야 할지 런타임에 결정되어야 하는 경우에 매우 유용합니다.
  • 프레임워크나 라이브러리에서 클라이언트가 특정 클래스를 직접 생성하지 않고, 프레임워크가 제공하는 방식으로 객체를 생성하도록 유도할 때 널리 사용됩니다.
  • 의존성 주입(DI) 컨테이너(예: Spring의 ApplicationContext)도 일종의 정교한 팩토리 역할을 수행합니다.