디자인 모델 (1) 상세 한 사례 디자인 모델

16922 단어 디자인 모드
목차
  • 1. 단일 모델 소개
  • 2. 굶 주 린 한식 사례 모델
  • 2.1 정적 상수 방식
  • 2.1.1 코드 실현
  • 2.1.2 장단 점
  • 2.2, 정적 코드 블록 방식
  • 2.2.1 코드 실현
  • 2.2.2 장단 점
  • 3. 게으름뱅이 식 단일 사례 모델
  • 3.1. 스 레 드 안전 하지 않 은 방식
  • 3.1.1 코드 실현
  • 3.1.2 장단 점
  • 3.2, synchronized 동기 화 방법
  • 3.2.1 코드 실현
  • 3.2.2 장단 점
  • 3.3, synchronized 동기 코드 블록
  • 3.3.1 코드 실현
  • 3.3.2 장단 점
  • 4. 이중 검사 식
  • 4.1, 코드 실현
  • 3.3.2 장단 점
  • 5. 자바 정적 내부 클래스 기반
  • 5.1, 코드 실현
  • 5.2, 장단 점
  • 1. 단일 모델 소개
    단일 디자인 모델 은 일정한 방법 으로 전체 프로그램 에서 특정한 유형 에 대해 하나의 대상 인 스 턴 스 만 존재 할 수 있 고 이 유형 은 하나의 대상 인 스 턴 스 방법 만 제공 하 는 것 이다.
    단일 디자인 모델 의 실현 은 다음 과 같은 몇 가지 방법 이 있다.
  • 굶 주 린 식 (정적 상수)
  • 굶 주 린 식 (정적 코드 블록)
  • 게으름뱅이 식 (스 레 드 가 안전 하지 않 음)
  • 게으름뱅이 식 (스 레 드 안전, 동기 화 방법 식, 집행 효율 이 높 지 않 음)
  • 게으름뱅이 식 (스 레 드 안전, 동기 코드 블록, 실행 효율 이 높 지 않 음)
  • 이중 검사 식 (스 레 드 안전, 집행 효율 이 높다)
  • 자바 정적 내부 클래스 기반 (스 레 드 안전, 실행 효율 높 음)
  • 2. 굶 주 린 한식 사례 모델
    2.1 정적 상수 방식
    2.1.1 코드 실현
    /**
     *@Description                 
     *@author warybee
     */
    public class SingleCase {
    
        /**
         *        
         */
        private SingleCase(){
    
        }
    
        /**
         *         
         */
        private final static SingleCase instance=new SingleCase();
    
        /**
         *        ,      
         * @return
         */
        public static  SingleCase getInstance(){
            return  instance;
        }
    }
    

    2.1.2 장단 점
  • 장점: 쓰기 가 비교적 간단 하고 클래스 를 불 러 올 때 실례 화 를 완성 하여 라인 동기 화 문 제 를 피 했다.
  • 단점: 클래스 를 불 러 올 때 클래스 의 실례 화 를 완 성 했 고 클래스 의 효 과 를 실현 하지 못 했다. 만약 에 이런 클래스 가 사용 되 지 않 았 다 면 메모리 낭비
  • 를 초래 할 수 있다.
    2.2 정적 코드 블록 방식
    2.2.1 코드 실현
    /**
     *@Description     
     *@author warybee
     */
    public class SingleCase {
    
        /**
         *        
         */
        private SingleCase(){
    
        }
    
    
        private static SingleCase instance;
    
        /**
         *        ,      
         */
        static {
            instance=new SingleCase();
        }
    
        /**
         *        ,      
         * @return
         */
        public static  SingleCase getInstance(){
            return  instance;
        }
    }
    

    2.2.2 장단 점
    정적 코드 블록 을 바탕 으로 하 는 단일 모드 이자 클래스 를 불 러 올 때 클래스 의 실례 화 를 완성 하여 라인 동기 화 문 제 를 피 했 지만 효 과 를 실현 하지 못 했다. 만약 에 이런 클래스 가 사용 되 지 않 았 다 면 메모리 낭 비 를 초래 할 수 있다.
    3. 게으름뱅이 식 단일 사례 모델
    3.1 라인 이 안전 하지 않 은 방식
    3.1.1 코드 실현
    /**
     *@Description     
     *@author warybee
     */
    public class SingleCase {
    
        /**
         *        
         */
        private SingleCase(){
    
        }
    
    
        private static SingleCase instance;
    
       
        /**
         *        ,      
         * @return
         */
        public static  SingleCase getInstance(){
            if (instance==null){
    
                instance=new SingleCase();
            }
            return  instance;
        }
    }
    

    3.1.2 장단 점
  • 이 클래스 를 사용 할 때 만 클래스 의 실례 화 를 진행 하여 발생 할 수 있 는 메모리 낭 비 를 피한다.
  • 단일 스 레 드 환경 에서 만 사용 할 수 있 고 다 중 스 레 드 환경 에서 여러 개의 인 스 턴 스 (한 스 레 드 가 들 어 갔 을 때 if (instance==null) 가 생 겼 으 며 앞으로 도 계속 실행 해 야 한다. 또한 다른 스 레 드 도 if (instance==null) 까지 실 행 했 는데 이때 여러 개의 인 스 턴 스 가 생 길 것 이다)
  • 3.2 synchronized 동기 화 방법
    3.2.1 코드 실현
    /**
     *@Description     
     *@author warybee
     */
    public class SingleCase {
    
        /**
         *        
         */
        private SingleCase(){
    
        }
    
    
        private static SingleCase instance;
    
    
        /**
         *        ,      
         * @return
         */
        public static synchronized SingleCase getInstance(){
            if (instance==null){
    
                instance=new SingleCase();
            }
            return  instance;
        }
    }
    

    3.2.2 장단 점
  • 장점: 스 레 드 안전
  • 단점: 실행 효율 이 낮 고 모든 스 레 드 가 클래스 인 스 턴 스 를 얻 으 려 면 현재 클래스 대상 의 자 물 쇠 를 먼저 얻 어야 합 니 다. 다른 스 레 드 는 현재 스 레 드 자물쇠 의 방출 을 기 다 려 야 합 니 다
  • 3.3, synchronized 동기 코드 블록
    3.3.1 코드 실현
    /**
     *@Description     
     *@author warybee
     */
    public class SingleCase {
    
        /**
         *        
         */
        private SingleCase(){
    
        }
    
    
        private static SingleCase instance;
    
    
        /**
         *        ,      
         * @return
         */
        public static SingleCase getInstance(){
            if (instance==null){
                //     
                synchronized(SingleCase.class){
                    instance=new SingleCase();
                }
            }
            return  instance;
        }
    }
    
    

    3.3.2 장단 점
    이 방법 은 자물쇠 의 입 도 를 줄 였 으 나 스 레 드 간 에 서로 자물쇠 가 풀 리 기 를 기다 리 는 경우 도 있어 집행 효율 이 높 지 않다.
    4. 이중 검사 식volatile 를 통 해 변수의 업데이트 작업 을 다른 스 레 드 에 알 리 고 volatile 변 수 를 방문 할 때 잠 금 동작 을 하지 않 기 때문에 실행 스 레 드 를 막 지 않 습 니 다.
    4.1 코드 구현
    /**
     *@Description     
     *@author warybee
     */
    public class SingleCase {
    
        /**
         *        
         */
        private SingleCase(){
    
        }
    
        /**
         *   volatile      ,       
         */
        private static volatile SingleCase instance;
    
    
        /**
         *        ,      
         * @return
         */
        public static SingleCase getInstance(){
            if (instance==null){
                //     
                synchronized(SingleCase.class){
                    if (instance==null){
                        instance=new SingleCase();
                    }
                }
            }
            return  instance;
        }
    }
    
    

    3.3.2 장단 점
  • 만약 에 여러 개의 스 레 드 가 첫 번 째 검 사 를 동시에 통과 하고 그 중의 한 스 레 드 가 먼저 두 번 째 검 사 를 통과 하고 대상 을 예화 했다 면 첫 번 째 검 사 를 통과 한 스 레 드 는 다시 예화 대상 을 통과 하지 않 을 것 이다. 자 물 쇠 를 추가 하 는 것 은 첫 번 째 초기 화 할 때 만 사용 하고 그 후의 호출 은 더 이상 자 물 쇠 를 추가 할 필요 가 없다.
  • 스 레 드 안전, 게 으 름 로드, 집행 효율 이 높다
  • 5. 자바 정적 내부 클래스 기반
    5.1 코드 구현
    /**
     *@Description     
     *@author warybee
     */
    public class SingleCase {
    
        /**
         *        
         */
        private SingleCase(){
    
        }
    
        private static class SingleCaseInner{
            private static SingleCase INSTANCE=new SingleCase();
        }
    
    
        /**
         *        ,      
         * @return
         */
        public static SingleCase getInstance(){
            return  SingleCaseInner.INSTANCE;
        }
    }
    

    5.2 장단 점
  • jvm 가 시 작 된 후 정적 내부 클래스 는 직접 불 러 오지 않 습 니 다.정적 내부 클래스 를 사용 할 때 만 그 는 로드 지연
  • 을 보증 합 니 다.
  • 외부 호출 getInstance() 방법 후 InnerClass 의 로 딩 을 촉발 합 니 다. 임의의 스 레 드 에서 이 [클래스 로 딩] 의 자 물 쇠 를 가 져 오 면 Static InnerClassSingleton 이 처음으로 new 에 나 와 하나의 스 레 드 만 이 내부 클래스 에 들 어 갈 수 있 습 니 다.로드 가 완료 되면 static 구성원 변 수 는 유일 합 니 다.
  • 좋은 웹페이지 즐겨찾기