클래스는 생성자와 별도로 정적 팩터리 제공한다. 그 클래스의 인스턴스를 반환하는 단순한 정적 메서드 말이다. 지금 얘기하는 팩터리 메서드는 디자인 패턴에서의 패턴과 다르다. 생성자 대신 정적 팩터리 메서드를 사용하는 방식은 장단점이 모두 존재한다.

장점

#1 이름을 가질 수 있다.

생성자는 객체의 특성을 제대로 설명하지 못한다. 반면, 정적 팩터리는 이름만으로 객체 특성 쉽게 묘사가 가능하다.

#2 호출 될 때마다 인스턴스를 새로 생성하지 않아도 된다.

불면 클래스는 인스턴스를 미리 만들어 놓거나 새로 생성한 인스턴스를 캐싱해 재활용함으로써 불필요한 객체 생성을 피한다.

반복되는 요청에 같은 객체를 반환 방식의 클래스는 언제 어느 인스턴스를 살릴 지 통제할 수 있다.이를 인스턴스 통제 클래스 라고 한다.

인스턴스를 통제하는 이유는 무엇일까 ?

#3 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다.

반환할 객체의 클래스를 자유롭게 선택할 수 있는 엄청난 유연성을 선물한다.

API 생성 시 구현 클래스를 공개하지 않고도 객체 반환할 수 있다.이는 인터페이스를 정적 페터리 메서드의 반환타입으로 사용하는 인터페이스 기반 프레임워크를 만드는 핵심기술이기도 하다.

자바 8부터는 인터페이스가 정적 메서드를 가질 수 있게 되었다. 따라서 인스턴스화 불가 동반 클래스를 둘 이유가 없다. 하지만, 정적 메서드들을 구현하기 위한 코드 중 많은 부분은 여전히 별도의 package-private 클래스에 두어야 한다. 자바 8에서도 인터페이스에는 public 정적 멤버만 허용하기 때문이다.

자바 9에서는 private 정적 메서드까지 허락하지만, 정적 필드와 정적 멤버 클래스는 여전히 public 이어야 한다.

#4 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다.