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

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


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

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

반응형

댓글