Effective Java - Item 1. 생성자 대신 팩토리 메서드를 고려하라
static인 팩토리 메소드를 제공하여, constructor 대신에 사용하는 것으로 인스턴스 생성에 관한 코드를 보다 알기 쉽게 할 수가 있다.
static 팩토리 메소드의 장점
생성자와 달리 이해하기 쉬운 메소드 이름을 지정할 수 있다.
Ramdom rand = new Random();
BigInteger.probablePrime(500, rand);
위의 BigInteger.probablePrime
메소드는 소수일 수 있는 수를 돌려주는 팩토리 메소드이다. new BigInteger(...)
라는 생성자를 호출하는 것보다 어떤 BigInteger
인스턴스를 생성하는지 명확하게 표현된다.
형 변환용의 팩토리 메소드 등은 관습으로 valueOf
, of
와 같은 메소드명이 사용된다.
Boolean b = Boolean.valueOf(true);
생성자와 다르게 메서드를 호출할 때마다 새 인스턴스를 만들 필요가 없다.
Service service = Service.getInstance();
위의 Service.getInstance()
는 새로운 인스턴스를 생성하도록 구현할 수도 있고, 효율화를 위해 재사용 가능한 객체를 반환하도록 구현할 수도 있다. 싱글톤 클래스에 있어서는 효율화를 위해서가 아닌, 동일한 인스턴스를 반환하기 위해서 이 형식의 팩토리 메소드를 용의하다.
생성자와 다르게 반환값이 되는 객체를 임의의 구상 클래스의 객체로 할 수 있다.
객체 지향의 다형성을 활용한 설계를 하려면, 인터페이스에 의한 메소드 액세스가 필요하다. 팩토리 메소드에 의해 구현 클래스의 인스턴스화를 숨길 수가 있으므로, 호출측에서는 자연스럽게 인터페이스를 이용한 코딩을 할 수 있게 된다.
public static Service createService(ServiceType type) {
switch (type) {
case FOO:
return new FooService()
case BAR:
return new BarService();
default:
return new DefaultService();
}
}
static 팩토리 메소드의 단점
다른 static 메소드와 구별하기 어렵다.
static 팩토리 메소드는 일반적으로 static 메소드(클래스 메소드)와 같은 위치에 있기 때문에, constructor 에 비해 인스턴스화 방법을 파악하기 어렵다. 클래스의 Javadoc 코멘트로서 인스턴스화 방법을 명시해 둘 필요가 있다.
최종 수정 : 2023-05-06