public class Order {
private boolean prime;
private boolean urgent;
private Product product;
public Order(Product product, boolean prime) {
this.product = product;
this.prime = prime;
}
public Order(Product product, boolean urgent) {
this.product = product;
this.urgent = urgent;
}
}
하지만 정적 팩터리 메서드를 사용하면 가능 ```java public class Order {
private boolean prime; private boolean urgent; private Product product;
public static Order primeOrder(Product product){ Order order = new Order(); order.prime = true; order.product = product; return order; }
public static Order urgentOrder(Product product){ Order order = new Order(); order.urgent = true; order.product = product; return order; }
}
-----
### 호출될 때마다 인스턴스를 새로 생성하지 않아도 된다.
- 새로운 인스턴스를 생성하지 않는 대표적인 예로는 **Boolean 클래스의 valueOf** 메소드가 있다.
* 매개변수에 따라 다른 인스턴스를 반환하는 거라고 생각하면 쉽다.
- 생성 비용이 큰 객체가 자주 요청되는 상황에선 성능이 좋아진다.
- 반복되는 요청에도 같은 객체를 반환해서 이를 **인스턴스 통제 클래스**라 한다.
```java
public static final Boolean TRUE = new Boolean(true);
@IntrinsicCandidate
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
public static HelloService of(String lang){
if(lang.equals("kr")){
return new HelloKorean();
}else{
return new HelloAmerican();
}
}
java8 이전엔 인터페이스에 정적 메서드 선언이 불가능했지만 지금은 가능 ```java public interface HelloService { String hello();
static HelloService of(String lang){ if(lang.equals(“kr”)){ return new HelloKorean(); }else{ return new HelloAmerican(); } }
}
### 정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다.
- 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());
}
}