팩터리 메서드의 장

정적 팩터리 메서드의 장점

  1. 이름을 가질 수 있다.
  2. 호출될 때마다 인스턴스를 새로 생성하지 않아도 된다.
  3. 반환 타입의 하위 타입의 객체를 반환 할 수 있다.
  4. 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환 할 수 있다.
  5. 정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다.

이름을 가질 수 있다.

}


-----

### 호출될 때마다 인스턴스를 새로 생성하지 않아도 된다.

- 새로운 인스턴스를 생성하지 않는 대표적인 예로는 **Boolean 클래스의 valueOf** 메소드가 있다.
  * 매개변수에 따라 다른 인스턴스를 반환하는 거라고 생각하면 쉽다. 
- 생성 비용이 큰 객체가 자주 요청되는 상황에선 성능이 좋아진다.
- 반복되는 요청에도 같은 객체를 반환해서 이를 **인스턴스 통제 클래스**라 한다.
```java

public static final Boolean TRUE = new Boolean(true);

@IntrinsicCandidate
public static Boolean valueOf(boolean b) {
  return (b ? TRUE : FALSE);
}

반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다.

}


### 정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다.
- HelloSerivce에 반환할 객체의 클래스가 존재하지 않아도 된다. 
-  인터페이스만 있고 인터페이스 구현체는 존재하지 않아도 된다. (정적 팩토리 메소드가 있는 상태에서..)
```java
public interface HelloService {
    String hello();
}
public class HelloServiceFactory {

    public static void main(String[] args) {
        ServiceLoader<HelloService> loader = ServiceLoader.load(HelloService.class);
        Optional<HelloService> helloServiceOptional = loader.findFirst();
        helloServiceOptional.ifPresent(helloService -> {
            System.out.println(helloService.hello());
        });
    }

}
public class HelloServiceFactory {

    public static void main(String[] args) {
        HelloService helloService = new HelloChina();
        System.out.println(helloService.hello());
    }

}

Service Provider Framework


정적 팩토리 메소드의 단점

  1. 상속을 할 수 없다.
  2. 프로그래머가 찾기 어렵다.

상속을 할 수 없다.

프로그래머가 찾기 어렵다.