클래스 사용자가 크 클래스의 인스턴스를 생성하는 방법 중 유용하게 사용할 수 있는 방법은 클래스에 public static factory 메소드를 두는 것이다. 이것은 static 메소드로써 그 클래스의 인스턴스 하나를 생성하여 반환한다.

즉. 아래와 같은 형태로 개발을 하는 것이다.
 public static Bollean valueOf(boolean b){
return b ? Boolean.TRIE : Boolean.FALSE;
}

장점
생성자 대신 static factory method를 제공할때의 장점
1. 자기 나름의 이름을 가질수 있다.
자바 클래스는 동일한 시그니처를 갖는 생성자를 하나만 가질 수 있게 되어 있다. 그래서 개발을 할 때 파라미터의 순서만 바꿔서 두 개의 생성자를 만드는 경우가 있는데 이런 때는 나중에 실수를 할 가능성이 크다. static factory method는 자신의 이름을 가질 수 있기 때문에 생성자와 같은 제약을 받지 않는다. 하나으 ㅣ클래스에 동일한 시그니처를 갖는 여러개의 생성자가 필요한 경우 생성자 대신 static factory method를 사용하자.

2. 호출할때마다 매번 새로운 객체를 생성할 필요가 없어진다.
불변 클래스의 경우 이미 생성된 인스턴스를 다시 사용할 수 있으며, 불필요하게 중복된 인스턴스들이 생성되는 것을 방지하기 위해 이미 생성된 인스턴스들을 저장했다가 반복 사용할 수 있다. static factory method는 여러번 호출되더라도 이미 생성된 동일 객체를 반환할 수 있으므로 클래스에서는 언제든지 인스턴스들의 존재를 직접 제어할 수 있다.
3. 자신의 클래스 인스턴스만 반환하는 생성자와 달리, 자신이 반환하는 타입의 어떤 서브타입 객체도 반환할 수 있다.

4. 매개변수화 타입의 인스턴스를 생성하는 코드를 간결하게 해준다.
parameterized 클래스의 생성자를 호출할 때는 type parameter를 지정하는데 그럼 이렇게 코딩해야 한다.
 Map<String, List<String>> map = new HashMap<String, List<String>>();
이렇게 하면 타이핑할 분량도 많아지고 소스도 복잡해진다. 그래서 이것을 static factory를 사용해서 아래와 같이 바꿔 사용한다.
     public static <K,V> HashMap<K, V> newInstance(){
     return new HashMap<K, V>();
    }

사용시
        Map<String, List<String>> m = UsingPoi.newInstance();
* UsingPoi는 클래스 이름.

단점
1.인스턴스 생성을 위한 static factory 메소드만 가지고 있으면서, public이나 protected 생성자가 없는 클래스의 경우는 서브 클래스를 가질수 없다

2. 다른 static 메소드와 햇갈릴수 있다.
이 부분은 클래스나 인터페이스 주석으로 표기를 하거나 공통적인 작명 규칙을 만들고 지킴으로써 단점을 줄일 수 있다.
  • valueOf - 자신의 매개변ㅅ와 같은 값을 갖는 인스턴스를 반환한다.
  • of - valueOf를 줄인 형태의 이름이면 EnumSet에서 사용한다.
  • getInstace - 매개변수에 나타난 인스턴스를 반환하지만 매개변수와 같은 값을 갖지 않는 경우도 있다. (싱글톤)
  • newInstance - getInstance와 유사하나 반환되는 각 인스턴스가 서로 다르다.
  • getType - getInstance와 유사하나 factory method가 다른 클래스에 있을 때 사용한다.

Posted by 서오석
,