단일 디자인 모델 (네 가지 실현 과 장단 점)

2933 단어 디자인 모드
일상 프로 그래 밍 에서 저 희 는 대상 을 사용 할 때 new 대상 을 자주 사용 합 니 다. 그러나 일부 자주 사용 하 는 대상 에 게 빈번 한 생 성 과 폐 기 는 저희 서버 에 적지 않 은 스트레스 를 줄 수 있 기 때문에 이런 상황 이 발생 하지 않도록 단일 대상 을 만들어 야 할 때 가 많 습 니 다.
단일 사례 의 생 성 은 크게 네 가지 로 나 뉜 다.
  • 굶 주 린 한식
  • 게으름뱅이 식
  • 정적 내부 클래스
  • 매 거 진
  • 굶 주 린 사람 식
    코드 구현:
    class Singleton{
    
        //      ,    new
        private Singleton(){ }
        
        //          
        private final static Singleton1 instance = new Singleton1();
    
        //      getInstance  ,         
        public static Singleton1 getInstance(){
            return instance;
        }
    
    }
    
  • 장점: 쓰기 가 간단 하고 다 중 스 레 드 동기 화 문 제 를 피한다.
  • 단점: 클래스 를 불 러 올 때 예화 되 어 게 으 름 피 울 수 없습니다. 나중에 이 인 스 턴 스 를 사용 하지 않 으 면 메모리 공간 을 낭비 합 니 다.

  • 게으름뱅이 식
    /**
     *     
     */
    public class Singleton {
        //  volatile      ,          instance         
        private static volatile Singleton instance;
    
        private Singleton(){}  //       ,  new   
    
        public static Singleton getInstance(){
            if(instance == null){
                //           ,   ,             ,           
                synchronized (Singleton.class){
                    if(instance == null){
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
    
  • 장점: 게 으 른 로드, 스 레 드 안전, 효율 이 비교적 높다
  • 확정: 쓰기 와 이해 에 어느 정도 난이도 가 있다
  • 이중 검사 의 의미: synchronized 를 getInstance () 방법 에 직접 놓 으 면 스 레 드 안전 문 제 를 해결 할 수 있 지만 전체 방법 을 동기 화 하 는 효율 이 너무 낮다.이중 검 사 는 만 들 때 만 자 물 쇠 를 추가 하 는 것 으로 자물쇠 의 섬세 도 최적화 에 해당 합 니 다. synchronized 에 if (instance = = null) 판단 을 추가 하지 않 으 면 이전 if (instance = = null) 판단 에 들 어간 스 레 드 가 새로운 인 스 턴 스 를 계속 만 들 수 있 습 니 다. 이중 검 사 는 이러한 상황 을 방지 하기 위해 서 입 니 다.

  • 정적 내부 클래스
    /**
     *          ,     
     */
    public class Singleton {
        private Singleton(){}
        
        public static class SingletonInstance{
            private static final Singleton INSTANCE = new Singleton();
        }
    
        public static Singleton getInstance(){
            return SingletonInstance.INSTANCE;
        }
    }
    
  • 클래스 를 불 러 올 때 스 레 드 는 안전 하기 때문에 정적 내부 클래스 를 사용 하여 단일 대상 을 만 듭 니 다. 스 레 드 가 안전 하고 이 종 류 는 한 번 만 불 러 옵 니 다.정적 내부 클래스 는 클래스 로 딩 할 때 불 러 오지 않 습 니 다. getInstance () 방법 으로 내부 클래스 에 접근 할 때 만 불 러 오기 때문에 게 으 른 로 딩 에 속 합 니 다.

  • 매 거
    public class Singleton {
        public static void main(String[] args) {
            Singleton instance1 = Singleton.INSTANCE;
            Singleton instance2 = Singleton.INSTANCE;
            instance1.getInstance();
            System.out.println(instance1 == instance2);
        }
    }
    
    enum Singleton{
        INSTANCE;
        public void getInstance(){
            System.out.println("           ");
        }
    }
    
  • 자바 작가 가 추천 하 는 방법 이지 만 매 거 진 것 은 굶 주 린 식 이 므 로 게 으 름 피 울 수 없습니다
  • 매 거 진 실현 은 반사 와 반 직렬 화 를 통 해 두 번 째 대상 을 만 들 어도 안 된다. 위의 몇 가지 실현 방법 은 반 사 를 통 해 새로운 사례 를 얻 을 수 있 고 특정한 의미 에서 진정한 사례 가 아니다.
  • 좋은 웹페이지 즐겨찾기