장점
public class Foo{
String name;
public Foo(String name){
## this.name = name;
}
public static Foo withName(String name){
return new Foo(name);
}
public static void main(String[] args){
Foo foo1 = new Foo("Minsu");
// 위의 코드만 보고 판단하기 어렵다.
Foo foo2 = Foo.withName("Minsu");
}
}
public class Foo{
String name;
public Foo(){
}
private static final Foo MS = new Foo();
public static Foo getFoo(){
return MS;
}
public static void main(String[] args){
Foo foo2 = Foo.getFoo();
}
}
getFoo를 실행할 때마다 새로운 객체를 생성해서 반환하는 것이 아니라, 미리 생성해둔 객체를 반환한다.
public class Foo{
public static Foo getFoo(boolean flag){
return ? new Foo() : new BarFoo();
}
static class BarFoo extends Foo{
}
public static void main(String[] args){
Foo foo3 = Foo.getFoo(false);
}
}
위의 getFoo는 flag의 값에 따라서 다른 타입의 객체를 반한시킨다.
타입은 하위 타입이어도 무방해진다.
enumSet의 경우 리턴하는 객체의 개수에 따라 RegularEnumSet 또는 JumboEnumSet으로 달라진다.
단점
생성자는 Javadoc 상단에 모아서 보여주지만 static 팩토리 메소드는 API 문서에서 다루어주지 않는다. 따라서 주석등으로 표시하는 것이 좋다.