ITEM.1 생성자 대신 정적 팩터리 메서드를 고려하라
기본 생성자 외에 정적 팩터리 메서드를 제공할 수 있다.
- 팩터리 메서드 : 그 클래스의 인스턴스를 반환하는 단순한 정적 메서드
장점1.
- 이름을 가질 수 있다. (객체 특성 묘사 가능)
장점2.
- 호출될 때마다 인스턴스를 새로 생성하지는 않아도 된다.
- 만약 호출할때마다 새로운 인스턴스를 생허가게 된다면 성능이 제어될 것이다. 이러한 경우를 방지하는 것을 인스턴스 통제 클래스라고 한다.

장점3.
- 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다.
- 생성자를 이용하지 않기때문에, 해당 클래스 내부에 있는 값에 대해서만 주고받아야 하는 제약이 사라졌다.
장점4.
- 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다.
장점5.
- 정적팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다.
- 마치 리플렉션과 같이 구조설계에 관련하여 동적인 설계가 가능해졌다. = '유연한 정적 팩터리'
- 동적 설계라는 표현에 맞게, 의존성 주입의 개념이 이와 같다.
단점1.
- 상속을 하려면 public이나 protected 생성자가 필요하니 정적 팩터리 메서드만 제공하면 하위 클래스를 만들 수 없다.
- 이 제약은 상속보다 컴포지션(ITEM.18)을 사용하도록 유도하고 불변타입(ITEM.17)으로 만들라고 하는 점에서 장점으로 적용 할 수 있다.
단점2.
- 생성자처럼 API설명에 명확히 드러나지 않으니 사용자는 정적 팩터리 메서드 방식 클래스를 인스턴스화할 방법을 알아내야한다.
정리
- 객체 인스턴스를 할당하는 생성자를 통해서 모든처리를 해야하는가?
- 그게 아니라면 정적팩터리메서드를 이용해보는게 어떤가?
- 그게 왜 좋냐면 생성자의 특정에서 벗어날 수 있다구!
- 이름도 다르게 쓰고, 항상 인스턴스를 새로 생성할 필요도 없고, 해당 클래스 외의 내용을 가변인수로 받을 수 있기 때문에 리플렉션과 같이 동적인 구조 설계가 가능해진다구!
- 단점으로는 생성자가 아니기때문에 구조상 이해가 어려울 수 있다라는 사소한정도