개발/자바

정적 팩토리 메소드 방식은 API 변경없이 싱글턴이 아니게 변경할 수 있다. (보충 설명)

primayy 2021. 6. 13. 14:35
728x90

이전에 작성했던 이펙티브 자바 아이템 3: 싱글턴 보증 방법 정리에서 제대로 이해하지 못했던 부분이 있었다.

 

바로 정적 팩토리 메소드 방식으로 싱글턴을 만드는 방법에서 장점으로 존재했던, API를 변경하지 않고도 싱글턴이 아니게 변경할 수 있다는 부분이었다.

 

API를 변경하지 않고 싱글턴이 아니게 변경할 수 있다는 것을 코드를 예시로 들어 작성하면 다음과 같다.

 

이전에 작성했던 정적 팩토리 메소드 방식의 싱글턴 인스턴스를 얻는 방법이다.

public class YongCoding{
	
    // 인스턴스를 얻기 위해서는 정적 팩토리 메소드를 이용해야한다.
	private static final YongCoding INSTANCE = new YongCoding();
    
    // private 생성자
    private YongCoding(){
    // 생략!
	}
    
    // 정적 팩토리 메소드 방식으로 싱글턴 객체 얻기
   	public static YongCoding getInstance(){
    	return INSTANCE;
    }
}

그러나 프로그램의 다음 버전에서 해당 클래스가 싱글턴을 반환하는 것이 아니라 새로운 객체를 생성해서 반환하기로 결정됐다면, 정적 팩토리 메소드 방식은 아래와 같이 코드를 수정할 수 있다.

public class YongCoding{
	
    // 인스턴스를 얻기 위해서는 정적 팩토리 메소드를 이용해야한다.
	private static final YongCoding INSTANCE = new YongCoding();
    
    // private 생성자
    private YongCoding(){
    // 생략!
	}
    
    // 정적 팩토리 메소드 방식으로 싱글턴 객체 얻기
   	public static YongCoding getInstance(){
    	return new YongCoding(); // 변경 부분
    }
}

기존에 인스턴스를 얻는데 사용했던 getInstance() 정적 팩토리 메소드는 더이상 같은 인스턴스를 반환하는 것이 아니라 새로운 객체를 생성해서 반환하게 변경했다.

 

그렇다면 기존에 YongCoding 클래스를 이용했던 다른 클래스들은 어떻게 될까?

// 시그니쳐의 변경이 없다.
// 클라이언트는 이 코드가 싱글턴인지 새로운 객체를 생성해서 반환하는지 상관없이 그대로 사용해도 아무 문제가 없다.
YongCoding.getInstance();

짠~ 아무 문제 없이 그대로 사용할 수 있다.

이런 특징이 바로 정적 팩토리 메소드 방식으로 싱글턴 객체를 반환할 때 API의 변경없이 싱글턴이 아니게 변경할 수 있다는 것이다.

 

그럼 정리는 여기서 끝!

728x90
반응형

'개발 > 자바' 카테고리의 다른 글

QueryDsl 설정 (인텔리제이, maven)  (1) 2022.04.05