참조 : Effective Java Chapter 2 Item 1

여러개의 생성자 대신 Static Factory 메소드를 제공하면 다음과 같은 장점이 있습니다.

장점: 이름을 가지고 있다.

Java API 중 BigInteger의 생성자 중에 BigInteger(int bitLength, int certainty, Random rnd) 이런 녀석이 있습니다.
과연 이 생성자가 무슨 일을 하는지 예측할 수 있나요? 없죠.
그럼 이 생성자와 동일한 역할을 하면서 Java 1.4에 추가된 Static Factory 메소드인 static
BigInteger probablePrime(int bitLength, Random rnd) 이 메소드는 어떤가요? 이번엔 무슨
일을 하는지 알 수 있지 않나요? 소수를 반환합니다.

이렇게 Java는 생성자의 이름이 클레스 이름과 동일해야 한다는 규칙 때문에 명확히 무슨 일을 하는 생성자인지 표현하지 못합니다.
이런 단점을 보완할 때 Static Factory 메소드를 사용할 수 있겠습니다.

장점: 생성자와는 달리 매번 새로운 객체를 생성하지 않아도 됩니다.

생성자를 사용하면 매번 새로운 객체를 반환받게 됩니다.
만약 같은 객체를 자주 여러 곳에서 사용해야 한다면 미리 만들어 둔 객체를 factory에서 반환 해주기만 하면 되겠죠.

public StaticFactoryExam {

private StaticFactoryExam exam = new StaticFactroyExam();

public static StaticFactoryExam getExam(){
return exam;
}

}

매우 간단하게 구현하다면 위와 같은 모습을 같은 객체를 계속 반환 할 수 있습니다.
매번 객체를 생성하지 않아도 되기 때문에 성능향상의 장점이 생깁니다.

Immutable 클레스와 싱글톤 객체를 다룰 때 자주 사용합니다.

장점: 생성자와는 달리 리턴 타입이 자유롭습니다.

생성자는 무조건 자신의 타입의 객체를 반환하지만 메소드에는 그러한 제한이 없습니다. 따라서 해당 클레스의 하위 타입을 반환해도 됩니다.
이런 특징을 잘 살리면 훨씬 유연한 API를 만들 수 있습니다.
Collections의 팩토리 메소드들을 생각해 보시면 될 것 같습니다.

단점: 다른 정적 팩토리 메소드와 구분이 안 됩니다.

생성자 처럼 API에서 눈에 띄는 위치에 있는 것도 아니기 때문에 다른 메소드들과 구분하는게 쉽지 않습니다.
이 문제는 컨벤션을 잘 적용하면 어느정도 해결할 수 있습니다.
예) getInstance(), valueOf()