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