일례 의 8 가지 표기 법

5870 단어 디자인 모드
                ,                   。                                 。         ,             。

  
                ,                    。

                    ,                。           ,                 ,                 ,                             。                  。

       
                  (      )           (       ,    getInstance    )。

                :
1.               ,                               ,                       ;
2.            ,          ,                  ,                                  。

    :
                    。            ,             ,                  ,             ,             ,                 。                                (         )。

  
              ,       ,               ,              。

  
             ,                 ,     new,              ,           。

    
               ;
                ,         ;
     ;
             。

실례:
1. 굶 주 린 사람
public class Singleton1 {
    private static final Singleton1 singleton1 = new Singleton1();
    private Singleton1(){}
    public static Singleton1 getInstance(){
        return singleton1;
    }
}
*   :        ,               。         。
*   :             ,    Lazy Loading   。               ,         。
public class Singleton2 {
    private static Singleton2 singleton2;
    static {
        singleton2 = new Singleton2();
    }
    private Singleton2(){}
    public static Singleton2 getInstance(){
        return singleton2;
    }

}
*    (     )[  ]
*      Singleton1       ,                    ,         ,            ,       。          。

2. 게으름뱅이
public class Singleton3 {
    private static Singleton3 singleton3;
    private Singleton3(){}
    public static Singleton3 getInstance(){
        if(singleton3 == null){
            singleton3 = new Singleton3();
        }
        return singleton3;
    }
}
* @Description    (     )[   ]
*        Lazy Loading   ,           。       ,       if (singleton == null)     ,         ,               ,          。                 。
public class Singleton4 {
    private static Singleton4 singleton4;
    private Singleton4(){}
    public static synchronized Singleton4 getInstance(){
        if(singleton4 == null){
            singleton4 = new Singleton4();
        }
        return singleton4;
    }
}
*    (    ,    )[    ]
*   Singleton3            ,          ,    getInstance()         。
*   :     ,              ,  getInstance()        。                    ,          ,  return   。             。
public class Singleton5 {
    private static Singleton5 singleton5;
    private Singleton5(){}
    public static Singleton5 getInstance(){
        if(singleton5 == null){
            synchronized (Singleton5.class){
                singleton5 = new Singleton5();
            }
        }
        return singleton5;
    }
}
*    (    ,     )[   ]
*   Singleton4          ,        ,              。                  。 Singleton3           ,
*          if (singleton == null)     ,         ,               ,          。
public class Singleton6 {
    private static Singleton6 singleton6;
    private Singleton6(){}
    public static Singleton6 getInstance(){
        if(singleton6 == null){
            synchronized (Singleton6.class){
                if (singleton6 == null){
                    singleton6 = new Singleton6();
                }
            }
        }
        return singleton6;
    }
}
*          [   ]
* Double-Check                ,      ,       if (singleton == null)  ,            。
*   ,           ,       ,  if (singleton == null),  return     。
*   :    ;    ;    。

3. 정적 내부 클래스
public class Singleton7 {
    private Singleton7(){}
    private static class SingletonGetInstance{
        private static final Singleton7 singleton7 = new Singleton7();
    }

    public static Singleton7 getInstance(){
        return SingletonGetInstance.singleton7;
    }
}
*      [   ]
*                  ,     。                            。              Singleton         ,
*   Lazy-Loading   ,         Singleton             ,         ,  getInstance  ,    SingletonInstance ,    Singleton    。
*                      ,     ,JVM             ,        ,          。
*   :        ,    ,   。

4. 매 거 류
public enum Singleton8 {
    INSTANCE;
    public void whateverMethod(){
        System.out.println("       ");
    }

    public static void main(String[] args) {
        Singleton8.INSTANCE.whateverMethod();
    }
}
* @Description   [   ]
*   JDK1.5             。            ,                  。
*         JDK1.5    ,          ,        。

5. CAS (AtomicReference) 의 도움 을 받 아
public class Singleton9 {
    private static final AtomicReference INSTANCE = new AtomicReference();
    private Singleton9(){}
    public static Singleton9 getInstance(){
        for (;;){
            Singleton9 singleton9 = INSTANCE.get();
            if(singleton9 != null){
                return singleton9;
            }
            singleton9 = new Singleton9();
            if (INSTANCE.compareAndSet(null,singleton9)){
                return singleton9;
            }
        }
    }
}
* @Description   CAS(AtomicReference)      
*  CAS                       ,CAS           ,         ,                   ,          。
* CAS                     (       ),  CPU         。
* CAS       ,         CAS          ,               ,        ,           ,            ,       。

좋은 웹페이지 즐겨찾기