출처 : 이펙티브 자바 (제2판)
생성자로 인스턴스를 생성하는 것 대신 public static 팩토리 메소드로 그 클래스의 인스턴스 하나를 생성하여 반환하는 방법이 있다.
public static Boolean valueOf(boolean b) {
return b ? Boolean.TRUE : Boolean.FALSE;
}
디자인 패턴에는 이것과 동일한 것이 없다.
static 팩토리 메소드는 생성자와 달리 자기 나름의 이름을 가질 수 있다.
호출될 때 마다 매번 새로운 객체를 생성할 필요가 없다.
자신이 반환하는 타입의 어떤 서브타입(subtype) 객체도 반환할 수 있다.
매개변수화 타입의 인스턴스를 생성하는 코드를 간결하게 해준다.
Map<String, List<String>> m = new HashMap<String, List<String>>();
static 팩토리를 사용하면 이를 해결할 수 있다. 이를 타입추론이라고 한다. 예를 들어 HashMap에서 다음의 static 팩토리 메소드를 제공한다고 가정해보자.
public static <K, V> HashMap<K, V> newInstance() {
return new HashMap<K, V>();
}
...
Map<String, List<String>> m = HashMap.newInstance();
대개의 경우 static 팩토리 메소드가 더 좋을 때가 많으므로 static 팩토리 메소드를 먼저 고려하지 않고 무심코 public 생성자를 사용하는 습관을 피하자.