Static Factory Method는 해당 클래스의 객체를 생성하는 역할을 하는 메서드이다.
객체 생성을 단순히 Constructor를 이용하여 직접 생성하는 것 대신, 객체 생성 로직을 static 메서드 내에 숨김으로써 클라이언트 코드와의 결합도를 줄이고, 더욱 유연하고 명확한 객체 생성을 가능하게 한다.
메소드의 이름을 명시적으로 지정할 수 있다.
생성자는 이름을 변경할 수 없지만, Static Factory Method는 보다 명확한 이름을 지정할 수 있어 가독성이 좋고, 객체 생성의 의도를 명확하게 나타낼 수 있다.
매번 새로운 객체를 생성할 필요가 없다.
이는 성능 최적화에 도움이 될 수 있으며, 불변 클래스의 경우 동일한 객체를 반복적으로 제공할 수 있다.
반환 타입의 하위 타입 객체를 반환할 수 있다.
이는 인터페이스 기반 프레임워크를 만드는 데 유용하며, 클래스의 공개 API를 덜 노출하면서도 객체를 반환할 수 있다.
반환할 객체의 클래스를 변경할 수 있는 유연성을 제공한다.
즉, 메소드의 반환 타입이 입력 매개변수에 따라 달라질 수 있습니다.
상속의 제한
Static Factory Method만 제공하고 생성자를 private로 선언하는 클래스는 상속할 수 없다. 왜냐하면 하위 클래스가 상위 클래스의 생성자를 호출해야 하는데 이가 불가능하기 때문이다.
Static Factory Method와 다른 정적 메소드를 구별하기 어렵다
API 문서를 자세히 읽지 않으면, 어떤 메소드가 Static Factory Method인지, 단지 Static method인지 구별하기 어려울 수 있다. 이 문제는 명명 규칙을 잘 따르는 것으로 어느 정도 완화할 수 있다.
자바에서는 다음과 같은 명명 규칙이 자주 사용된다.
of
,from
,parse
,valueOf
,instanceOf
,getInstance
,newInstance
,getType
,newType
API 문서를 작성하는데 제약
일반적으로 개발자들은 API 문서에서 생성자를 쉽게 찾을 수 있지만, Static Factory Method는 일반적인 메소드와 동일하게 취급되므로 찾기가 어려울 수 있다. 따라서, API 사용자에게 이 메소드들이 있는 것을 알려주기 위해 추가적인 노력이 필요하다고 한다.
하나 이상의 매개변수를 받아서 해당 타입의 적합한 인스턴스를 반환한다.
Optional.java
LocalDate.java
하나의 매개변수를 받아서 해당 타입의 적합한 인스턴스를 반환한다. 매개변수의 타입은 반환될 인스턴스와 다를 수 있다.
문자열을 받아서 해당 타입의 적합한 인스턴스를 반환한다.