
우아한테크토스에서 사다리 미션을 진행하면서 생성자에서 객체를 생성하기 위한 어떠한 과정들이 많았다.
이것을 정적 팩토리 메서드를 통해서 분리하며 가독성을 높인 경험이 있다.
이 내용을 공유하고자 한다.
정적 팩토리 메서드는 객체를 생성하는 메서드로, 해당 클래스의 인스턴스를 반환한다.
이 메서드들은 클래스의 인스턴스를 생성하고 초기화하는 방법을 캡슐화한다.
간단하게 생각해서 팩토리 패턴을 객체 안에서 static을 통해 사용한다고 보면 된다.
정적 팩토리 메서드의 예시는 다음과 같다.
기본 생성자는 private으로 하고 정적 팩토리 메서드에는 public static을 붙인다.
public class Players {
private final List<Player> players;
private Players(List<Player> players) {
this.players = players;
}
public static Players from(List<String> playerNames) {
validateSize(playerNames);
List<Player> players = playerNames.stream()
.map(Player::new)
.toList();
return new Players(players);
}
...
}
그렇다면 정적 팩토리 메서드를 왜 쓸까??
나의 경우 정적 팩토리 메서드를 쓰는 이유는 다음과 같다.
다른 장점으로는 다음과 같다.
나같은 경우는 dto를 작성할 때, 객체 생성 로직이 복잡해질 때 정적 팩토리 메서드를 사용하는 편이다. 그리고 enum에서 값에 따라 특정 타입을 결정하는 경우 사용한다.
다른 경우로 객체를 캐싱하고 관리하는 경우, 싱글톤 패턴으로 구현하는 경우, 하위 클래스를 반환하는 경우에 쓰인다.
정적 팩토리 메서드에는 네이밍 규칙이 존재한다.
객체 생성 로직이 복잡해 지거나 캐싱이 필요한 경우 정적 팩토리 메서드를 사용해보자!