여기서 팩토리란?

GoF 디자인 패턴 중 팩토리 패턴에서 유래한 팩토리 라는 단어는 객체를 생성하는 역할을 분리하겠다는 취지가 담겨있다.

다시 말해, 정적 팩토리 메서드란 객체 생성의 역할을 하는 클래스 메서드라는 의미로 요약해볼 수 있다.

public static LocalTime of(int hour, int minute) {
  ChronoField.HOUR_OF_DAY.checkValidValue((long)hour);
  if (minute == 0) {
    return HOURS[hour];
  } else {
    ChronoField.MINUTE_OF_HOUR.checkValidValue((long)minute);
    return new LocalTime(hour, minute, 0, 0);
  }
}

위 예시 코드에서 본 LocalTime 클래스의 of 메서드처럼 직접적으로 생성자를 통해 객체를 생성하는 것이 아닌 메서드를 통해서 객체를 생성하는 것을 정적 팩토리 메서드라고 한다.

또 다른 예시로 enum의 요소를 조회할 때 사용하는 valueOf 도 정적 팩토리 메서드의 일종이라고 할 수 있다.

미리 생성된 객체를 “조회”를 하는 메서드이기 때문에 팩토리의 역할을 한다고 볼 수는 없지만, 외부에서 원하는 객체를 반환해주고 있으므로 결과적으로는 정적 팩토리 메서드라고 간주해도 좋다.

그럼 생성자와 어떤 차이가 있을까?

이펙티브 자바 - 생성자 대신 정적 팩토리 메서드를 고려하라

[장점 1. 이름을 가질 수 있다.]

객체는 생성 목적과 과정에 따라 생성자를 구별해서 사용할 필요가 있다.

new라는 키워드를 통해 객체를 생성하는 생성자는 내부 구조를 잘 알고 있어야 목적에 맞게 객체를 생성할 수 있다.

하지만 팩토리 메서드를 사용하면 메서드 이름에 객체의 생성 목적을 담아 낼 수 있다.

→ 해당 생성의 목적을 이름에 표현할 수 있어 가독성이 좋아지는 효과가 있다.

[장점 2. 호출할 때마다 새로운 객체를 생성할 필요가 없다.]