Singleton Pattern

 - 유일한 시스템 컴 포넌트를 선언

1. 드래코니언 동기화 

 - 성능적으로 이슈

 - 멀티쓰레드 이슈

2. 더블 락킹 (Double Locking)

 - 성능적으로 이슈 (1.5이하에서 사용)

3. Singleton Holder

 - 1.5 이상. 

4. 한정적 메모리의 Singleton - WeakReference

 - VM이 한정적일때 사용

 - 가비지 콜렉터의 대상이 됨.

5. Enum을 이용한 생성 (가장 추천)

  1. enum Singleton {
  2.         // Thread Safe 하다. 하나만 있음을 보장한다.
  3.         // Serialization 에서도 안전하다.
  4.         // Reflection 에 대해서도 보장한다.
  5.         // - Effective Java 에 소개.
  6.         // - 유럽에서 사용한다.
  7.         // - 많이 알려지지 않았지만 Java언어에서 보장하는 좋은 방법
  8.         INSTANCE;
  9.        
  10.         public Singleton getInstance() {
  11.                 return INSTANCE;
  12.         }
  13. }


  1. // Singleton
  2. // 유일한 시스템 컴포넌트를 설계할 때 사용.
  3. class CursorOld {
  4.         // DCL.
  5.         private static volatile CursorOld INSTANCE = null; // 두개이상 존재 가능성이 있으므로 volatile 선언
  6.  
  7.         private CursorOld() {
  8.  
  9.         }
  10.  
  11.         // public static Cursor getInstance() {
  12.         // 1. Draconian 동기화 // 성능적으로 이슈가 있다.
  13.         // public static synchronized Cursor getInstance() {
  14.         // 2. Double checked locking
  15.         // 성능적으로 떨어짐 (1.5 이하)
  16.         public static CursorOld getInstance() {
  17.                 if (INSTANCE == null) {
  18.                         // 멀티쓰레드 안정성이 없다.
  19.                         synchronized (CursorOld.class) { //성능 이슈를 발생
  20.                                 if (INSTANCE == null) {
  21.                                         INSTANCE = new CursorOld();
  22.                                 }
  23.                         }
  24.                 }
  25.                 return INSTANCE;
  26.         }
  27. }
  28.  
  29. // 사용되지 않을 수도 있다. 시작부터 끝까지 존재한다.
  30. // lazy initialize 가 필요할 수도있다. 성능적으로 도움
  31.  
  32. // for jdk 1.5 이상.
  33. class Cursor {
  34.         // 만들면서 초기화.
  35.         public static final Cursor INSTANCE = new Cursor();
  36.  
  37.         // 1. public
  38.         private Cursor() {
  39.         }
  40.  
  41.         // 2. static factory method
  42.         public static Cursor getInstance() { // 메소드로 접근해도 느리지 않다.
  43.                 return INSTANCE;
  44.         }
  45. }
  46.  
  47. // Initialization On Demand Holder Idiom
  48. // lazy initialize.
  49. class SingletonHolder {
  50.         private SingletonHolder() {
  51.  
  52.         }
  53.  
  54.         private static class SingleHolder {
  55.                 private static final SingletonHolder INSTANCE = new SingletonHolder();
  56.         }
  57.  
  58.         // 내부적으로 인스턴스가 호출될때 처음 접근, 그때 생성을 보장
  59.         public static SingletonHolder getInstance() {
  60.                 return SingleHolder.INSTANCE;
  61.         }
  62. }
  63.  
  64. // weak reference를 통한 해제 가능한 Singleton
  65. // JavaVM이 한정된 메모리를 가지고 있을 때 유용하다.
  66. //메모리 부족시 지웠다가 없으면 다시 생성
  67. // for android
  68. class Singleton {
  69.         static private WeakReference<Singleton> singleton;
  70.        
  71.         public Singleton getInstance() {
  72.                 Singleton m = singleton.get();
  73.                 if(!= null) {
  74.                         return m;
  75.                 }
  76.                 synchronized (Singleton.class) {
  77.                         m = singleton.get();
  78.                         if(!= null) {
  79.                                 return m;
  80.                         }
  81.                         m = new Singleton();
  82.                         singleton = new WeakReference<Singleton>(m);
  83.                        
  84.                 }
  85.                 return m;
  86.         }
  87. }


'java > design_pattern' 카테고리의 다른 글

Template Method Pattern  (0) 2014.06.27
Adapter 패턴  (0) 2014.06.27
Design Pattern 기본 원칙  (0) 2014.06.18
Builder Pattern  (0) 2014.06.17
Java Beans Pattern  (0) 2014.06.17

+ Recent posts