본문 바로가기
프로그래밍 놀이터/디자인 패턴, 리펙토링

[Design Pattern/Java] private 생성자나 enum 타입을 사용해서 싱글톤의 특성을 유지하자.

by 돼지왕왕돼지 2012. 2. 10.
반응형


안녕하세요 돼지왕왕돼지입니다.
오늘은 private 생성자나 enum 타입을 사용해서 싱글톤의 특성을 유지하자. 라는 내용을 함께 보고자 합니다.
이 글은 "Effective Java"의 내용을 기반으로 하였습니다.


싱글톤 ( Singleton )?


싱글톤 ( Singleton ) 은 시스템이나 어플리케이션에 정확히 하나의 인스턴스만 유지되는 클래스를 말합니다. 이런 싱글톤은 본질적으로 유일한 시스템 컴포넌트를 나타냅니다. ( ex) 윈도우 매니저, 파일 시스템 )



싱글톤을 구현하는 기본적인 방법 1.


public class Elvis{
     public static final Elvis INSTANCE = new Elvis();
     private Elvis() { ... }
}




 싱글톤을 구현하는 기본적인 방법 2.


public class Elvis{
     private static final Elvis INSTANCE = new Elvis();
     private Elvis(){ ... }
     public static Elvis getInstance(){
         return INSTANCE;
     }
}


- 방법 1보다 좋은 점 : 클래스에서 반환하는 싱글톤 인스턴스의 형태를 바꿀 수 있는 유연성을 제공합니다. 즉, 반드시 INSTANCE 만 반환할 필요가 없지요. 이 부분은 일반적인 팩토리 메소드의 장점을 갖는 것으로 보면 되겠습니다. ( ex) 팩토리 메소드에서는 오직 하나의 인스턴스만을 반환하지만, 각 스레드마다 하나씩 인스턴스를 반환하도록 수정 가능 )

2012/01/10 - [프로그래밍 놀이터/디자인 패턴] - [DesignPattern/Java] 생성자 대신 static factory method를 사용해보자.


- 단점 : 직렬화를 할 때 추가 작업이 필요합니다. Singleton class 를 serializable 로 만드려면, implements Serializable 추가하고, 싱글톤을 보장하기 위해 모든 인스턴스 필드를 transient 로 선언, readResolve method 추가해야 합니다. 아니면, deserialized 될때마다 새로운 인스턴스가 생성됩니다. ( 싱글톤이 깨진단 의미로 볼 수 있죠 )


[readResolve method]



싱글톤을 구현하는 기본적인 방법 3.


하나의 요소를 갖는 enum 타입을 만든다.

public enum Elvis{
     INSTANCE;
}


- 장점 : 기본적인 방법 1와 기능적으로는 동일하지만 더 간단하다. 복잡한 직렬화나 리플렉션 상황에서도 직렬화가 자동으로 지원되고, 인스턴스가 여러 개 생기지 않도록 확실하게 보장해준다.


( 아직 널리 쓰이지는 않지만 ) 싱글톤을 구현하는 가장 좋은 방법이다.

 
로그인 없이 추천 가능합니다. 손가락 꾸욱~

반응형

댓글0